Ответ
В корутинах есть несколько альтернативных способов обработки исключений:
- CoroutineExceptionHandler - глобальный обработчик для корутин:
val handler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
scope.launch(handler) { /* код */ }
- SupervisorJob - позволяет изолировать сбой в дочерних корутинах:
val supervisor = SupervisorJob()
scope.launch(supervisor) { /* код */ }
- supervisorScope - область с супервизором:
supervisorScope {
launch { /* код 1 */ }
launch { /* код 2 */ } // если упадет, не отменит первую
}
- async с await - исключения оборачиваются в Deferred:
val deferred = async { /* код */ }
try {
deferred.await()
} catch (e: Exception) { /* обработка */ }
- Result API - обертка для возврата результата или исключения:
val result: Result<Type> = runCatching { /* код */ }
result.onSuccess { }.onFailure { }