Выбор ответа Middle Исключения в корутинах спрашивают часто обновлено
try/catch вокруг launch
Вопрос
Поймает ли этот catch исключение из корутины?
try {
scope.launch { error("boom") }
} catch (e: Exception) {
println("caught")
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Нет: launch вернётся сразу, ошибка случится позже внутри. launch только запускает корутину и сразу возвращает Job.
Варианты ответа
- Да,
tryловит всё, что происходит в блоке, включая корутины - Нет:
launchвернётся сразу, ошибка случится позже внутриправильный ответ - Да, но только на
Dispatchers.Main, где всё синхронно - Нет, потому что
error()бросаетError, а неException
Разбор
launch только запускает корутину и сразу возвращает Job. Исключение случится позже, в другом стеке вызовов, и пойдёт по иерархии Job, а не в окружающий try. Ловить нужно внутри корутины вокруг конкретного вызова. Диспетчер на это не влияет, а error() бросает IllegalStateException, то есть Exception.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Исключения в корутинах»
- Ошибка в async и try вокруг await
- CancellationException и родитель
- Где работает CoroutineExceptionHandler
- Ошибки в launch и async
- Распространение исключений
- CoroutineExceptionHandler в дочерней корутине
- launch(SupervisorJob()) внутри scope
- Путь необработанного исключения из дочернего launch