Sobes.tech
Junior — Middle

Quelle est la différence entre la gestion des erreurs dans les coroutines en utilisant la construction try/catch et l'utilisation de CoroutineExceptionHandler?

sobes.tech IA

Réponse de l'IA

En Kotlin, la gestion des erreurs dans les coroutines peut se faire de deux manières : via try/catch à l’intérieur de la coroutine elle-même et via CoroutineExceptionHandler.

  • try/catch à l’intérieur de la coroutine permet d’intercepter localement les exceptions qui se produisent dans le bloc de code de la coroutine. C’est pratique lorsque vous souhaitez traiter l’erreur précisément là où elle peut survenir.

  • CoroutineExceptionHandler est un gestionnaire global d’exceptions pour les coroutines qui se terminent par une erreur et qui n’ont pas été interceptées localement. Il ne fonctionne qu’avec les coroutines lancées avec launch (qui retournent un Job), et pas avec async (qui retournent un Deferred), car async nécessite un appel explicite à await pour récupérer le résultat et gérer les exceptions.

Exemple :

val handler = CoroutineExceptionHandler { _, exception ->
    println("Exception capturée dans CoroutineExceptionHandler : $exception")
}

GlobalScope.launch(handler) {
    try {
        // Code pouvant lancer une exception
        throw RuntimeException("Erreur dans la coroutine")
    } catch (e: Exception) {
        println("Capturé localement : $e")
    }
}

Si l’exception est capturée dans try/catch, CoroutineExceptionHandler ne sera pas déclenché. Si l’exception n’est pas gérée localement, elle sera envoyée à CoroutineExceptionHandler. Ainsi, try/catch assure une gestion locale, tandis que CoroutineExceptionHandler est global et sert à la journalisation ou à d’autres actions en cas d’exceptions non gérées.