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

supervisorScope и упавший ребёнок

Вопрос

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

import kotlinx.coroutines.*

fun main() = runBlocking {
    val handler = CoroutineExceptionHandler { _, e -> println("handled ${e.message}") }
    supervisorScope {
        launch(handler) { error("A failed") }
        launch {
            delay(100)
            println("B done")
        }
    }
    println("end")
}

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

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

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

Коротко

Код выведет: handled A failed, B done, end. В supervisorScope ошибка первой корутины не отменяет вторую и сам scope.

Что выведет

handled A failed
B done
end

Разбор

В supervisorScope ошибка первой корутины не отменяет вторую и сам scope. Так как это прямой ребёнок супервизора, исключение уходит в её CoroutineExceptionHandler. Вторая корутина спокойно завершается, supervisorScope дожидается её и возвращается.

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

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