Какие знаешь способы работы с исключениями в корутинах кроме try-catch

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

Ответ

В корутинах есть несколько альтернативных способов обработки исключений:

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