Sobes.tech
Назад к вопросам
Junior — Middle
86

Какие отличия в обработке ошибок существуют между использованием launch и async/await в корутинах?

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

sobes.tech AI

В Kotlin корутинах launch и async отличаются по обработке ошибок:

  • launch: запускает корутину, которая не возвращает результат. Если внутри launch возникает исключение, оно передаётся в CoroutineExceptionHandler или пробрасывается в родительский контекст, что может привести к отмене родительской корутины.

  • async: запускает корутину, возвращающую Deferred — отложенный результат. Исключения внутри async не выбрасываются сразу, а откладываются до вызова await(). Если не вызвать await(), ошибка может остаться незамеченной.

Пример:

val job = launch {
    throw Exception("Ошибка в launch")
}

val deferred = async {
    throw Exception("Ошибка в async")
}

runBlocking {
    job.join() // исключение будет обработано здесь
    try {
        deferred.await() // исключение выбрасывается здесь
    } catch (e: Exception) {
        println("Поймана ошибка: ${e.message}")
    }
}

Таким образом, launch сразу сигнализирует об ошибке, а async — только при попытке получить результат.