Использование try...catch блоков. Стандартный способ обработки исключений. Работает внутри корутины.
kotlin
try...catch не подходит для обработки uncaught исключений, выброшенных из дочерних корутин, запущенных в другом CoroutineScope.
CoroutineExceptionHandler. Перехватывает необработанные исключения, выброшенные корутинами, которые запущены в данном CoroutineScope или в его дочерних CoroutineScope.
kotlin
CoroutineExceptionHandler срабатывает только для исключений, которые не обрабатываются механизмом структурированной конкурентности.
SupervisorJob и supervisorScope. В отличие от обычного Job, когда дочерняя корутина с ошибкой приводит к отмене родительского Job, SupervisorJob не отменяет родительский Job при ошибке дочерней корутины. supervisorScope создает CoroutineScope с SupervisorJob.
kotlin
Используется для независимых дочерних задач, где ошибка одной не должна влиять на другие. Не заменяет try...catch или CoroutineExceptionHandler, скорее меняет поведение распространения исключений.
Распространение исключений в структурированной конкурентности. По умолчанию, исключение в дочерней корутине отменяет родительскую корутину и всех ее сиблингов.
kotlin
Это базовое поведение структурированной конкурентности, которое помогает избежать утечек ресурсов и состояний.
Использование async с await(). Исключения, выброшенные в async, не распространяются автоматически. Они хранятся внутри Deferred и выбрасываются только при вызове await().
kotlin
Это позволяет выборочно обрабатывать ошибки для каждой асинхронной задачи.
| Способ | Назначение | Обрабатывает uncaught? | Изменяет распространение? |
|---|---|---|---|
try...catch | Обработка исключений внутри текущей корутины | Нет | Нет |
CoroutineExceptionHandler | Перехват необработанных исключений в Scope | Да | Нет |
SupervisorJob/Scope | Изменение поведения распространения исключений | Нет | Да |
| Структурированная конкурентность | Автоматическая отмена при ошибке | Да | Да |
async + await() | Отложенное распространение исключения | Нет | Да (до await) |