Back to questions
Junior — Middle
81
Будет ли отменено выполнение async, если внутри него находится launch, и при этом происходит исключение?
Companies where asked
Viasat tech
Answer from AI
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()