Sobes.tech
Назад к вопросам
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()