Ir al contenido

Gestión de Errores

Comprendida la naturaleza de las excepciones y la necesidad de gestionarlas, el siguiente paso lógico es conocer estructuras para manejar situaciones excepcionales de forma controlada. En este contexto, los bloques try, catch y finally constituyen la base del control de excepciones.

Estos bloques permiten a los programas anticipar fallos, capturar los errores que ocurran y definir qué debe hacerse en respuesta, ya sea recuperarse del problema, notificarlo o realizar tareas de limpieza antes de continuar o terminar la ejecución.


La forma más básica de gestionar una excepción en Java consiste en encerrar el código que podría fallar dentro de un bloque try y manejar el fallo dentro de uno o más bloques catch.

try {
// Código que puede lanzar una excepción
} catch (TipoDeExcepcion nombreVariable) {
// Código que se ejecuta si ocurre ese tipo de excepción
}
  • El bloque try contiene el código que se quiere vigilar: operaciones como divisiones, accesos a archivos, conexiones a bases de datos, etc.
  • El bloque catch captura una excepción específica que puede haberse producido dentro del bloque try. Si se lanza esa excepción, se ejecuta el contenido del catch, y se evita que el programa termine abruptamente.

El bloque catch debe proporcionar suficiente contexto para identificar la causa del error, incluyendo mensajes descriptivos, detalles del estado del programa o del dato que causó la falla, facilitando la depuración y la corrección del problema.


El bloque finally contiene instrucciones que siempre se ejecutan, ocurra o no una excepción dentro del try.
Se utiliza principalmente para liberar recursos, cerrar conexiones o garantizar que ciertas acciones ocurran sin importar si hubo error.

try {
// Código que puede fallar
} catch (TipoDeExcepcion e) {
// Manejo del error
} finally {
// Código que siempre se ejecuta
}

Esto es útil, por ejemplo, para cerrar un archivo o una conexión a una base de datos, asegurando que el recurso no quede abierto incluso si hubo un fallo.


El comportamiento de estos bloques sigue una lógica clara:

  1. Se ejecuta el bloque try.

  2. Si no ocurre ninguna excepción, se omiten los bloques catch y se ejecuta el bloque finally (si está presente).

  3. Si ocurre una excepción, se interrumpe el bloque try justo en la línea donde ocurre el error:

    • Se busca un bloque catch que pueda manejar ese tipo de excepción.
    • Si se encuentra uno, se ejecuta su contenido.
    • Si no hay un bloque catch adecuado, la excepción se propaga al nivel superior del programa (por ejemplo, al método que llamó al actual), y puede detener el programa si no se captura en ningún punto del camino.

      Ejemplo: Si una división por cero no se captura en ningún nivel, la excepción ArithmeticException terminará deteniendo el programa por completo, mostrando un error en consola.

  4. El bloque finally, si existe, siempre se ejecuta, incluso si hubo error.


Separación entre lógica principal y manejo de errores

Sección titulada «Separación entre lógica principal y manejo de errores»

Una práctica incorrecta es intentar manejar errores con retornos especiales (por ejemplo, retornar -1, null o false cuando algo falla), lo cual mezcla la lógica principal del programa con el control de errores. Esta técnica vuelve el código ambiguo, más difícil de leer y de mantener, porque obliga a agregar validaciones en cada línea que invoca un método.

Se recomienda utilizar bloques try-catch, ya que permiten separar la lógica del programa del manejo de errores, manteniendo el código más limpio y claro. Esto evita repetir validaciones innecesarias y permite manejar las excepciones solo donde sea necesario.