Ответ
В Kotlin Coroutines есть несколько способов обработки исключений:
- try-catch внутри корутины:
launch {
try {
someSuspendFunction()
} catch (e: Exception) {
// обработка
}
}
- CoroutineExceptionHandler для обработки не пойманных исключений:
val handler = CoroutineExceptionHandler { _, exception ->
// логирование/обработка
}
launch(handler) { ... }
- SupervisorJob - позволяет продолжать работу других дочерних корутин при падении одной:
val scope = CoroutineScope(SupervisorJob())
scope.launch { ... }
- supervisorScope - аналогично SupervisorJob, но для конкретного блока:
supervisorScope {
launch { ... }
}
- async с await() - исключения нужно обрабатывать при вызове await():
val deferred = async { ... }
try {
deferred.await()
} catch (e: Exception) { ... }