Ответ
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") }
}