launch(SupervisorJob()) внутри scope
Вопрос
Почему scope.launch(SupervisorJob()) { launch { error("a") }; launch { delay(100); println("b") } } не изолирует ошибки детей?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
SupervisorJobстал родителем корутины, а её дети под обычным Jobправильный ответSupervisorJobнельзя передавать вlaunch, он будет проигнорирован- Ошибки изолируются,
bнапечатается, аaуйдёт в обработчик errorвнутри вложенногоlaunchне бросает исключение наружу
Разбор
Job из контекста становится родителем создаваемой корутины. У самой корутины Job обычный, поэтому падение первого ребёнка отменит её и второго ребёнка, b не напечатается. Супервизором оказался только внешний объект, а заодно корутина отвязалась от scope и не будет отменена вместе с ним. Правильно: scope.launch { supervisorScope { ... } }.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
CoroutineExceptionHandler в дочерней корутине
Следующий вопрос
Путь необработанного исключения из дочернего launch
Ещё по теме «Исключения в корутинах»
- Ошибка в async и try вокруг await
- CancellationException и родитель
- Где работает CoroutineExceptionHandler
- Ошибки в launch и async
- Распространение исключений
- async в корне и потерянная ошибка
- coroutineScope отменяет соседей
- supervisorScope и упавший ребёнок