Назад к вопросам
Junior — Middle
80
Будет ли отменено выполнение async, если внутри него находится launch, и при этом происходит исключение?
Компании, где спрашивали
Viasat tech
Ответ от нейросети
sobes.tech AI
В Kotlin Coroutines, если внутри блока async запускается корутина через launch, исключение, возникшее в launch, не отменит выполнение async автоматически.
Причина в том, что async и launch создают разные корутины с разными механизмами обработки ошибок:
asyncвозвращаетDeferredи ошибки внутри него будут проброшены при вызовеawait().launchзапускает корутину, которая не возвращает результат, и исключения в ней обрабатываются через CoroutineExceptionHandler или приводят к отмене родительской корутины.
Если launch запущен внутри async без явного связывания с его Job, исключение в launch не отменит async. Чтобы обеспечить отмену, нужно запускать launch в том же CoroutineScope или использовать SupervisorJob, либо обрабатывать ошибки явно.
Пример:
val deferred = async {
launch {
throw Exception("Ошибка в launch")
}
// выполнение async продолжится
}
// Исключение из launch не повлияет на deferred, пока не будет вызван await()