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

try/catch вокруг launch

Вопрос

Поймает ли этот catch исключение из корутины?

try {
    scope.launch { error("boom") }
} catch (e: Exception) {
    println("caught")
}

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

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

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

Коротко

Правильный ответ: Нет: launch вернётся сразу, ошибка случится позже внутри. launch только запускает корутину и сразу возвращает Job.

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

  1. Да, try ловит всё, что происходит в блоке, включая корутины
  2. Нет: launch вернётся сразу, ошибка случится позже внутриправильный ответ
  3. Да, но только на Dispatchers.Main, где всё синхронно
  4. Нет, потому что error() бросает Error, а не Exception

Разбор

launch только запускает корутину и сразу возвращает Job. Исключение случится позже, в другом стеке вызовов, и пойдёт по иерархии Job, а не в окружающий try. Ловить нужно внутри корутины вокруг конкретного вызова. Диспетчер на это не влияет, а error() бросает IllegalStateException, то есть Exception.

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

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