Mejores prácticas en el tratamiento de excepciones Java

Las excepciones son condiciones excepcionales, como su propio nombre indica) que ocurren en tiempo de ejecución. Si en el desarrollo no son correctamente gestionadas (manejadas) ocasionarán la finalización del flujo de ejecución de vuestra aplicación.

Realmente el tratamiento de las excepciones podría considerarse un requisito no funcional del software. En definitiva es un problema transversal que debe ser considerado para evitar problemas en ejecución. El lenguaje de programación Java proporciona las palabras reservadas try, catch, finally, throw y throws para poder trabajar con las excepciones.

Adquisición tardía de recursos y liberación temprana

Los recursos empleados por nuestro desarrollo deben ser reservados lo mas tarde posible y liberados lo antes posible, esto es algo que es obvio en cualquier campo cuando trabajamos con recursos limitados o compartidos.
En cuanto a la liberación debemos usar el bloque finally, esto es debido a que en este bloque el código se ejecuta siempre, al margen de que se produzca o no excepción (aseguramos la ejecución). En este bloque debiéramos incluir la liberación de recursos del tipo ficheros, conexiones a bbdd, etc.

Lanzamiento temprano de excepciones y/o informa rápido

En caso de problemas, debemos lanzar lo antes posible, no dejemos que falle el código y seamos pro-activos en el lanzamiento, el caso obvio es el tratamiento de ficheros, como ejemplo. Una linea como esta en un método que esta tratando un fichero puede ahorrarnos muchos quebraderos de cabeza:


if(file == null) throw new CustomException("Nombre de fichero no puede ser null", "NULL_FILE_NAME");

Captura tardía

En muchas ocasiones lo programadores tienden a capturar excepciones y la almacenar el log de error. Esta practica es absurda debido a que el programa no recibe el error y por lo tanto no es consciente del problema.
Solo deben capturarse las excepciones que seamos capaces de tratar, en otro caso es mejor no capturarlas, justo al contrario de lo que muchos hacen en la actualidad.

Mensajes descriptivos

Como siempre, cuando estamos picando el bloque de excepciones, con las prisas siempre pasamos por alto los mensajes descriptivos, es una practica habitual, estoy mas que harto de verlo y supongo que el lector también. Supongo que muchos de vosotros en alguna ocasión las habrá pasado putas intentando localizar el origen de una excepción, mal trago que se hubiese podido solucionar describiendo correctamente el problema en el bloque correspondiente.
Se puede usar un logger asíncrono para no bloquear el hilo principal a la hora de almacenar los logs.

Inclusión de la pila de trazas

No se debe capturar o lanzar una excepción sin preservar la pila de trazas. Como sabéis mantener la pila de trazas es fundamental para ayudar en el proceso de depuración de cualquier aplicación. Si lanzamos una excepción, asegúrate de pasar el objeto «exception» original al constructor de la nueva excepción de esa forma aseguramos la pila.

try {
/* some code that might raise an exception */ }
catch( Exception e ) {
// Note that the initial exception is lost.
throw new Exception(); }

En el código anterior, la pila de trazas se pierde pues estamos lanzando una nueva excepción sin preservar el objeto exception anterior.

try {
/* some code that might raise an exception */ }
catch( Exception e ) {
// Note that the initial exception is not lost.
throw new CustomException("There was an error", e); }

En el código anterior la instancia de la excepción original se preserva al pasarse en el constructor personalizado.

Documentación de los bloques exception

No deben emplearse bloques catch vacíos. El código que aparece en el bloque de excepción debe justificar por si mismo la existencia de dicho bloque. Esto es especialmente importante cuando desarrollamos API’s que obviamente deseamos que otros desarrolladores usen.
Es interesante en estos casos también limitarse a las excepciones base de Java, pues son clases muy conocidas por los desarrolladores.

Usa las excepciones correctamente

El uso de excepciones es costoso y en alguna ocasiones no es necesario lanzar una excepción para controlar un error, una mera variable boolean seria suficiente. Este tipo de aproximación puede emplearse cuando una operación es opcional y no quieres que tu desarrollo sea interrumpido por un fallo en la misma.

Documentar mediante javadoc las excepciones

Debemos usar el tag @throws de javadoc para describir claramente que excepciones pueden ser lanzadas por el método, es de mucha ayuda cuando estas proporcionando un interface para que otras aplicaciones lo usen.

You must be logged in to post a comment.