Назад к вопросам
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 — только при попытке получить результат.