runCatching в корутинах
Вопрос
Почему runCatching { api.load() } внутри корутины считается опасным?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Он не ловит исключения, брошенные из suspend-функций
- Он ловит и
CancellationException, отмена теряетсяправильный ответ - Он блокирует поток до завершения
api.load() - Он не компилируется с suspend-лямбдой внутри
Разбор
runCatching ловит любой Throwable, включая CancellationException. Если корутину отменили во время api.load(), результат станет Result.failure, и код пойдёт дальше, будто это обычная ошибка сети. Решение: перебрасывать отмену (onFailure { if (it is CancellationException) throw it }), свой вариант suspendRunCatching или ловить конкретные типы. runCatching inline, поэтому работает с suspend-вызовами и поток не блокирует.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
supervisorScope и упавший ребёнок
Следующий вопрос
Стратегия обработки ошибок в корутинах
Ещё по теме «Исключения в корутинах»
- Ошибка в async и try вокруг await
- CancellationException и родитель
- Где работает CoroutineExceptionHandler
- Ошибки в launch и async
- Распространение исключений
- CoroutineExceptionHandler в дочерней корутине
- launch(SupervisorJob()) внутри scope
- Путь необработанного исключения из дочернего launch