Отменится async при выбросе исключения если внутри async лежит launch в корутинах

«Отменится async при выбросе исключения если внутри async лежит launch в корутинах» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, async не отменится автоматически при исключении внутри launch. async и launch работают независимо.

val deferred = async {
    launch {
        throw RuntimeException("Ошибка внутри launch")
    }
    delay(1000)
    "Результат"
}

try {
    deferred.await()
} catch (e: Exception) {
    println("Поймано: ${e.message}") // Не сработает, исключение в launch не пробросится
}

Чтобы обработать исключение, нужно:

  1. Использовать supervisorScope или CoroutineExceptionHandler
  2. Явно ждать завершения launch через join()
async {
    supervisorScope {
        launch { throw RuntimeException() }.join()
    }
}