En Kotlin, el manejo de excepciones se implementa mediante la construcción try/catch/finally, pero se diferencia del enfoque de Java al centrarse en las Unchecked Exceptions y tener una sintaxis más limpia. Una diferencia clave es que en Kotlin no existen las checked exceptions, lo que libera al programador de la obligación de declarar throws y capturar tales excepciones.
Java utiliza checked/unchecked exceptions, donde las checked requieren una captura o declaración explícita. Esto a menudo conduce a un código redundante y poco conveniente. Kotlin se diseña de una manera más sencilla: todas las excepciones, en general, son unchecked (heredadas de RuntimeException), facilitando el manejo y haciendo el código más legible.
Los desarrolladores de Java en Kotlin intentan capturar y declarar checked exceptions: el código compila, pero el sentido se pierde. Además, el uso de finally sin comprender los matices puede provocar fugas o código que no funciona.
Usamos try/catch/finally en Kotlin de manera breve y efectiva:
fun process(data: String): Int = try { data.toInt() } catch (e: NumberFormatException) { 0 } finally { println("Processing done") }
Características clave:
¿Qué sucede si se lanza una excepción en el bloque finally? ¿Cómo afecta esto al valor de retorno?
Las excepciones lanzadas desde finally siempre sobrescriben cualquier otra excepción o retorno del bloque try/catch, lo que puede llevar a la pérdida de datos importantes sobre la causa del fallo.
fun demo(): Int = try { 1 } finally { throw RuntimeException("error in finally") }
¿Puede try/catch ser una expresión en Kotlin? ¿En qué se diferencia de Java?
Sí. try/catch/finally en Kotlin son expresiones, por lo que pueden devolver un resultado y usarse en lugares donde se permiten valores.
val value = try { risky() } catch (e: Exception) { fallback() }
En Java, son solo declaraciones.
¿Es necesario capturar excepciones en Kotlin si se llama a una función Java externa con throws?
No. Dado que las checked exceptions son ignoradas por el compilador de Kotlin: no es necesario capturarlas explícitamente, pero aún así pueden ser lanzadas durante la ejecución.
Insertan catch (e: Exception) en todas partes, sin diferenciar entre errores reales y esperados. Usan finally para devolver un valor, lo que lleva a un comportamiento inesperado en caso de errores.
Ventajas:
Desventajas:
Usan la captura solo de errores esperados, finally solo para limpiar recursos, y utilizan try/catch como expresiones donde esto mejora la legibilidad.
Ventajas:
Desventajas: