Ответ
В Coroutines ошибки обрабатываются через try/catch или CoroutineExceptionHandler. Основные нюансы:
- Необработанные исключения отменяют родительскую корутину и все дочерние (если не
SupervisorJob). - SupervisorJob позволяет дочерним корутинам завершаться независимо.
- async требует явного вызова
await(), иначе исключение не будет выброшено. - ExceptionHandler работает только для корневых корутин (
launch, но неasync).
Пример:
val handler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
val scope = CoroutineScope(SupervisorJob() + handler)
scope.launch {
throw RuntimeException("Failed!")
}