Что выведет код Senior Исключения в корутинах обновлено

async в корне и потерянная ошибка

Вопрос

Что выведет код? По строке на каждый вывод.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val scope = CoroutineScope(SupervisorJob())
    val d = scope.async {
        delay(50)
        error("boom")
    }
    delay(200)
    println("still alive")
    try {
        d.await()
    } catch (e: IllegalStateException) {
        println("await: ${e.message}")
    }
    println("active=${scope.isActive}")
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: still alive, await: boom, active=true. Корневой async в scope с SupervisorJob не роняет приложение и не отменяет scope: исключение хранится в Deferred.

Что выведет

still alive
await: boom
active=true

Разбор

Корневой async в scope с SupervisorJob не роняет приложение и не отменяет scope: исключение хранится в Deferred. Программа работает дальше и печатает still alive. Ошибка появляется только при await(). Scope остаётся активным, потому что супервизор не реагирует на падение ребёнка.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.