Какие знаешь способы обработки исключений в Coroutines

«Какие знаешь способы обработки исключений в Coroutines» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kotlin Coroutines есть несколько способов обработки исключений:

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