Обработка исключений в корутинах

Буква 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее