Sobes.tech
Junior — Middle

¿En qué se diferencia el manejo de errores dentro de las corutinas usando la construcción try/catch de la utilización de CoroutineExceptionHandler?

sobes.tech AI

Respuesta de la IA

En Kotlin, el manejo de errores en las corrutinas puede realizarse de dos maneras: mediante try/catch dentro de la propia corrutina y mediante CoroutineExceptionHandler.

  • try/catch dentro de la corrutina permite capturar localmente las excepciones que ocurren en el bloque de código de la corrutina. Esto es útil cuando se necesita manejar el error justo donde puede ocurrir.

  • CoroutineExceptionHandler es un manejador global de excepciones para las corrutinas que terminan con un error y no fueron capturadas localmente. Solo funciona con corrutinas lanzadas con launch (que devuelven un Job), y no con async (que devuelven un Deferred), ya que async requiere una llamada explícita a await para obtener el resultado y manejar excepciones.

Ejemplo:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Excepción capturada en CoroutineExceptionHandler: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Código que puede lanzar una excepción
        throw RuntimeException("Error dentro de la corrutina")
    } catch (e: Exception) {
        println("Capturado localmente: $e")
    }
}

Si la excepción es capturada en try/catch, CoroutineExceptionHandler no se activará. Si la excepción no se maneja localmente, será enviada a CoroutineExceptionHandler. De esta forma, try/catch proporciona manejo local, mientras que CoroutineExceptionHandler es global y sirve para registrar o realizar otras acciones en caso de excepciones no manejadas.