Что выведет код 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 ошибок.
Ещё по теме «Исключения в корутинах»
- Ошибка в async и try вокруг await
- CancellationException и родитель
- Где работает CoroutineExceptionHandler
- Ошибки в launch и async
- Распространение исключений
- CoroutineExceptionHandler в дочерней корутине
- launch(SupervisorJob()) внутри scope
- Путь необработанного исключения из дочернего launch