Sobes.tech
Junior — Middle

Come si differenzia la gestione degli errori all'interno delle coroutine utilizzando la costruzione try/catch rispetto all'uso di CoroutineExceptionHandler?

sobes.tech AI

Risposta dell'AI

In Kotlin, la gestione degli errori nelle coroutine può essere effettuata in due modi: tramite try/catch all’interno della coroutine stessa e tramite CoroutineExceptionHandler.

  • try/catch all’interno della coroutine permette di intercettare localmente le eccezioni che si verificano nel blocco di codice della coroutine. È utile quando si desidera gestire l’errore proprio nel punto in cui può verificarsi.

  • CoroutineExceptionHandler è un gestore globale di eccezioni per le coroutine che terminano con un errore e non sono state catturate localmente. Funziona solo con le coroutine avviate con launch (che restituiscono un Job), e non con async (che restituiscono un Deferred), poiché async richiede una chiamata esplicita a await per ottenere il risultato e gestire le eccezioni.

Esempio:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Eccezione catturata in CoroutineExceptionHandler: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Codice che può generare un’eccezione
        throw RuntimeException("Errore all’interno della coroutine")
    } catch (e: Exception) {
        println("Catturato localmente: $e")
    }
}

Se l’eccezione viene catturata in try/catch, CoroutineExceptionHandler non si attiverà. Se l’eccezione non viene gestita localmente, verrà inviata a CoroutineExceptionHandler. In questo modo, try/catch garantisce una gestione locale, mentre CoroutineExceptionHandler è globale e serve per il logging o altre azioni in caso di eccezioni non gestite.