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

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

Ответ

В Coroutines ошибки обрабатываются через try/catch или CoroutineExceptionHandler. Основные нюансы:

  1. Необработанные исключения отменяют родительскую корутину и все дочерние (если не SupervisorJob).
  2. SupervisorJob позволяет дочерним корутинам завершаться независимо.
  3. async требует явного вызова await(), иначе исключение не будет выброшено.
  4. ExceptionHandler работает только для корневых корутин (launch, но не async).

Пример:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Caught $exception")
}
val scope = CoroutineScope(SupervisorJob() + handler)

scope.launch {
    throw RuntimeException("Failed!")
}