Выбор ответа Senior Исключения в корутинах обновлено

CoroutineExceptionHandler в дочерней корутине

Вопрос

Сработает ли handler в этом коде?

val handler = CoroutineExceptionHandler { _, e -> println("handled") }

scope.launch {
    launch(handler) { error("boom") }
}

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Нет: у дочерней корутины ошибка уходит родителю. Обработчик используется только там, где исключение больше некуда передать: в корневой корутине или в прямом ребёнке SupervisorJob/supervisorScope.

Варианты ответа

  1. Да, обработчик ловит ошибки любой корутины, куда его передали
  2. Да, но только для async, у launch он игнорируется
  3. Нет, CoroutineExceptionHandler устарел и ничего не делает
  4. Нет: у дочерней корутины ошибка уходит родителюправильный ответ

Разбор

Обработчик используется только там, где исключение больше некуда передать: в корневой корутине или в прямом ребёнке SupervisorJob/supervisorScope. Здесь внутренний launch дочерний, ошибка уходит внешнему launch, а у него обработчика нет, поэтому она дойдёт до scope. Для async обработчик не работает вовсе: ошибка ждёт await(). API не устарел.

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

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