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

launch(SupervisorJob()) внутри scope

Вопрос

Почему scope.launch(SupervisorJob()) { launch { error("a") }; launch { delay(100); println("b") } } не изолирует ошибки детей?

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

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

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

Коротко

Правильный ответ: SupervisorJob стал родителем корутины, а её дети под обычным Job. Job из контекста становится родителем создаваемой корутины.

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

  1. SupervisorJob стал родителем корутины, а её дети под обычным Jobправильный ответ
  2. SupervisorJob нельзя передавать в launch, он будет проигнорирован
  3. Ошибки изолируются, b напечатается, а a уйдёт в обработчик
  4. error внутри вложенного launch не бросает исключение наружу

Разбор

Job из контекста становится родителем создаваемой корутины. У самой корутины Job обычный, поэтому падение первого ребёнка отменит её и второго ребёнка, b не напечатается. Супервизором оказался только внешний объект, а заодно корутина отвязалась от scope и не будет отменена вместе с ним. Правильно: scope.launch { supervisorScope { ... } }.

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

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