Буква a не будет напечатана: launch отменён до завершения delay. Ошибка RuntimeException("E") в дочернем async отменит обычный runBlocking и выйдет наружу, даже без await.
Обработка исключений в корутинах
Буква a не будет напечатана: launch отменён до завершения delay. Ошибка RuntimeException("E") в дочернем async отменит обычный runBlocking и выйдет наружу, даже без await.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет выведен при выполнении следующего кода Kotlin?
runBlocking {
launch {
delay(timeMillis = 500)
print("a")
}.cancel(CancellationException("Fix"))
async {
throw RuntimeException("E")
}
}
Ответ
Буква a не будет напечатана: launch отменён до завершения delay. Ошибка RuntimeException("E") в дочернем async отменит обычный runBlocking и выйдет наружу, даже без await.
CancellationException при явной отмене первой задачи — штатная отмена, а не причина падения родителя. Для async внутри обычной structured-concurrency иерархии исключение распространяется к родителю; утверждение «async никогда не бросает без await» здесь неверно. Без внешнего catch выполнение завершится исключением E.
Источник: kotlinlang.org.