Ответ
Нет, async не отменится автоматически при исключении внутри launch. async и launch работают независимо.
val deferred = async {
launch {
throw RuntimeException("Ошибка внутри launch")
}
delay(1000)
"Результат"
}
try {
deferred.await()
} catch (e: Exception) {
println("Поймано: ${e.message}") // Не сработает, исключение в launch не пробросится
}
Чтобы обработать исключение, нужно:
- Использовать
supervisorScopeилиCoroutineExceptionHandler - Явно ждать завершения
launchчерезjoin()
async {
supervisorScope {
launch { throw RuntimeException() }.join()
}
}