В чем разница между обработкой ошибки в корутине с помощью try/catch и CoroutineExceptionHandler

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

Ответ

try/catch обрабатывает ошибки синхронно в пределах блока кода, где вызвана корутина. Если исключение не перехвачено, оно завершает корутину.

CoroutineExceptionHandler — глобальный обработчик для асинхронных ошибок в корневых корутинах (запущенных через launch). Он не перехватывает исключения в async (там нужно использовать await).

Пример:

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

// С handler
GlobalScope.launch(handler) { throw Exception() }

// С try/catch
GlobalScope.launch {
    try { throw Exception() } 
    catch (e: Exception) { println("Caught $e") }
}