Выбор ответа Senior Исключения в корутинах обновлено
CoroutineExceptionHandler в дочерней корутине
Вопрос
Сработает ли handler в этом коде?
val handler = CoroutineExceptionHandler { _, e -> println("handled") }
scope.launch {
launch(handler) { error("boom") }
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Нет: у дочерней корутины ошибка уходит родителю. Обработчик используется только там, где исключение больше некуда передать: в корневой корутине или в прямом ребёнке SupervisorJob/supervisorScope.
Варианты ответа
- Да, обработчик ловит ошибки любой корутины, куда его передали
- Да, но только для
async, уlaunchон игнорируется - Нет,
CoroutineExceptionHandlerустарел и ничего не делает - Нет: у дочерней корутины ошибка уходит родителюправильный ответ
Разбор
Обработчик используется только там, где исключение больше некуда передать: в корневой корутине или в прямом ребёнке SupervisorJob/supervisorScope. Здесь внутренний launch дочерний, ошибка уходит внешнему launch, а у него обработчика нет, поэтому она дойдёт до scope. Для async обработчик не работает вовсе: ошибка ждёт await(). API не устарел.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Исключения в корутинах»
- Ошибка в async и try вокруг await
- CancellationException и родитель
- Где работает CoroutineExceptionHandler
- Ошибки в launch и async
- Путь необработанного исключения из дочернего launch
- async в корне и потерянная ошибка
- coroutineScope отменяет соседей
- supervisorScope и упавший ребёнок