Sobes.tech
Назад к вопросам
Junior — Middle
80

Как отличается обработка ошибок внутри корутин с использованием конструкции try/catch от использования CoroutineExceptionHandler?

Компании, где спрашивали
Газпром МедиаГазпром Медиа
Юрент

Ответ от нейросети

sobes.tech AI

В Kotlin корутинах обработка ошибок может осуществляться двумя способами: через try/catch внутри самой корутины и через CoroutineExceptionHandler.

  • try/catch внутри корутины позволяет локально перехватывать исключения, возникающие в блоке кода корутины. Это удобно, когда нужно обработать ошибку непосредственно там, где она может произойти.

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

Пример:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Поймано исключение в CoroutineExceptionHandler: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Код, который может выбросить исключение
        throw RuntimeException("Ошибка внутри корутины")
    } catch (e: Exception) {
        println("Поймано локально: $e")
    }
}

Если исключение поймано в try/catch, CoroutineExceptionHandler не сработает. Если исключение не обработано локально, оно попадёт в CoroutineExceptionHandler. Таким образом, try/catch обеспечивает локальную обработку, а CoroutineExceptionHandler — глобальную и служит для логирования или других действий при необработанных исключениях.