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

coroutineScope отменяет соседей

Вопрос

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

import kotlinx.coroutines.*

fun main() = runBlocking<Unit> {
    try {
        coroutineScope {
            launch {
                try {
                    delay(1000)
                    println("B done")
                } finally {
                    println("B cancelled")
                }
            }
            launch {
                delay(100)
                error("A failed")
            }
        }
    } catch (e: IllegalStateException) {
        println("caught ${e.message}")
    }
}

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

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

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

Коротко

Код выведет: B cancelled, caught A failed. Через 100 мс вторая корутина падает.

Что выведет

B cancelled
caught A failed

Разбор

Через 100 мс вторая корутина падает. В coroutineScope с обычным Job это отменяет scope и первую корутину: её delay бросает CancellationException, выполняется finally, а B done не печатается. Когда все дети завершены, coroutineScope бросает исходное исключение, и его ловит внешний try.

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

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