Назад к вопросам
Middle
121
questionbank

Каковы отличия между launch и async в контексте обработки ошибок?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В launch ошибки распространяются непосредственно на родительский корутинный контекст, что приводит к падению приложения, если они не обработаны. В async ошибки откладываются и возникают только при вызове .await().

Например:

fun main() = runBlocking {
    // launch: ошибка приводит к падению scope
    val job = launch {
        throw IllegalStateException("Ошибка в launch")
    }
    job.join() // Дождет завершения job, в случае ошибки job будет отменен

    // async: ошибка откладывается до await
    val deferred = async {
        throw IllegalStateException("Ошибка в async")
        "Результат" // Этот код не будет выполнен
    }
    try {
        deferred.await() // Здесь будет выброшена отложенная ошибка
    } catch (e: IllegalStateException) {
        println("Перехвачена ошибка: ${e.message}")
    }
}