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

runCatching в корутинах

Вопрос

Почему runCatching { api.load() } внутри корутины считается опасным?

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

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

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

Коротко

Правильный ответ: Он ловит и CancellationException, отмена теряется. runCatching ловит любой Throwable, включая CancellationException.

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

  1. Он не ловит исключения, брошенные из suspend-функций
  2. Он ловит и CancellationException, отмена теряетсяправильный ответ
  3. Он блокирует поток до завершения api.load()
  4. Он не компилируется с suspend-лямбдой внутри

Разбор

runCatching ловит любой Throwable, включая CancellationException. Если корутину отменили во время api.load(), результат станет Result.failure, и код пойдёт дальше, будто это обычная ошибка сети. Решение: перебрасывать отмену (onFailure { if (it is CancellationException) throw it }), свой вариант suspendRunCatching или ловить конкретные типы. runCatching inline, поэтому работает с suspend-вызовами и поток не блокирует.

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

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