Sobes.tech
Junior — Middle

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

sobes.tech AI

Отговор от 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 — глобална и служи за логване или други действия при необработени изключения.