Sobes.tech
Junior — Middle

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/catch uvnitř 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.

  • CoroutineExceptionHandler je 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 s async (které vracejí Deferred), protože async vyžaduje explicitní volání await pro 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.