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