Выбор ответа Middle Исключения в корутинах обновлено
Независимые параллельные запросы
Вопрос
Как загрузить три независимых виджета параллельно, чтобы ошибка одного не отменила остальные?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: supervisorScope, три async и try у каждого await(). В supervisorScope ошибка одного async не отменяет scope и братьев, а исключение достаётся только тому, кто вызвал await(), поэтому каждый await оборачивают в try и подставляют заглушку. coroutineScope с awaitAll отменит всё при первой…
Варианты ответа
coroutineScopeс тремяasyncиawaitAll()GlobalScope.asyncдля каждого виджета отдельноsupervisorScope, триasyncиtryу каждогоawait()правильный ответrunBlockingс тремяlaunchвнутри
Разбор
В supervisorScope ошибка одного async не отменяет scope и братьев, а исключение достаётся только тому, кто вызвал await(), поэтому каждый await оборачивают в try и подставляют заглушку. coroutineScope с awaitAll отменит всё при первой ошибке, это подходит, когда нужны все результаты. GlobalScope ломает structured concurrency, runBlocking блокирует поток.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Исключения в корутинах»
- Ошибка в async и try вокруг await
- CancellationException и родитель
- Где работает CoroutineExceptionHandler
- Ошибки в launch и async
- Распространение исключений
- CoroutineExceptionHandler в дочерней корутине
- launch(SupervisorJob()) внутри scope
- Путь необработанного исключения из дочернего launch