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