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