Ответ
Корутина может упасть из-за необработанного исключения внутри её блока кода. Основные причины:
- Неотловленные исключения (
ExceptionилиRuntimeException) - Отмена родительской корутины (если
CoroutineExceptionHandlerне установлен) - Ошибки в
async-блоке, если не вызванawait()
Пример:
val scope = CoroutineScope(Job() + Dispatchers.IO)
scope.launch {
throw RuntimeException("Oops!") // Упадёт, если нет обработчика
}
// Без await() исключение потеряется
val deferred = scope.async { error("Fail") }
Как предотвратить:
- Использовать
try/catchвнутри корутин - Устанавливать
CoroutineExceptionHandler - Всегда вызывать
await()дляasync