Jak se liší zpracování chyb uvnitř korutin pomocí konstrukce try/catch od použití CoroutineExceptionHandler?
sobes.tech AI
Odpověď od AI
V Kotlinu může být zpracování chyb v korutinách provedeno dvěma způsoby: pomocí try/catch uvnitř samotné korutiny a pomocí CoroutineExceptionHandler.
-
try/catchuvnitř korutiny umožňuje lokálně zachytit výjimky, které vzniknou v bloku kódu korutiny. Je to užitečné, když chcete chybu zpracovat přímo tam, kde může nastat. -
CoroutineExceptionHandlerje globální správce výjimek pro korutiny, které skončí chybou a nebyly zachyceny lokálně. Funguje pouze s korutinami spuštěnými pomocílaunch(které vracejíJob), nikoli sasync(které vracejíDeferred), protožeasyncvyžaduje explicitní voláníawaitpro získání výsledku a zpracování výjimek.
Příklad:
val handler = CoroutineExceptionHandler { _, exception ->
println("Chyba zachycena v CoroutineExceptionHandler: $exception")
}
GlobalScope.launch(handler) {
try {
// Kód, který může vyvolat výjimku
throw RuntimeException("Chyba uvnitř korutiny")
} catch (e: Exception) {
println("Lokálně zachyceno: $e")
}
}
Pokud je výjimka zachycena v try/catch, CoroutineExceptionHandler se neaktivuje. Pokud není výjimka lokálně ošetřena, je předána CoroutineExceptionHandler. Tímto způsobem try/catch zajišťuje lokální zpracování, zatímco CoroutineExceptionHandler je globální a slouží například k logování nebo jiným akcím při nezachycených výjimkách.