org.gvsig.tools.exception
Elementos para construir y manejar excepciones en gvSIG
En el paquete *org.gvsig.tools.exception* se encuentra la base que los componentes de gvSIG utilizan para crear sus propias excepciones. Las dos clases centrales, que definen los dos tipos básicos de excepción que se pueden crear, son *BaseException* y *BaseRuntimeException*. Ambas clases implementan la interfaz *IBaseException* y extienden respectivamente *java.lang.Exception* y *java.lang.RuntimeException*. Por tanto su manejo es similar al de cualquier excepción, y únicamente se requiere que las excepciones que extiendan de ellas incluyan determinados datos y métodos adicionales en sus implementaciones para que puedan incorporar el comportamiento deseado. .. figure:: ./images/exception-model1.png :scale: 80 :alt: TEXTO :align: center El uso de este modelo aporta algunas ventajas como la localización del mensaje, mejora de la trazabilidad, o el paso de información contextual al usuario y, en definitiva, la normalización del uso de excepciones en gvSIG. Para crear un nuevo tipo de excepción basta con extender BaseException (o BaseRuntimeException). El siguiente ejemplo es una implementación completamente funcional de *BaseException*. Ejemplo: .. code-block:: java public class DriverException extends BaseException { // Este código único se utiliza para identificar el tipo de excepción private static final long serialVersionUID = -8985920349210629999L; // Clave para localización private static final String KEY = "Error_in_the_driver_%(driverName)s"; // Mensaje private static final String MESSAGE = "Error in the driver %(driverName)s"; // Miembro/s que contiene/n información contextual propia de cada clase de excepción. private String driverName; // Constructor con información contextual. public DriverException(String driverName) { super(MESSAGE, KEY, serialVersionUID); this.driverName = driverName; } // Constructor con una causa origen, se usa cuando lanzamos una excepción después de capturar otra public DriverException(String driverName, Throwable cause) { super(MESSAGE, cause, KEY, serialVersionUID); this.driverName = driverName; } // Este es el constructor completo que requiere BaseException. public DriverException(String driverName, String message, Throwable cause, String key, long code) { super(message, cause, key, code); this.driverName = driverName; } // Implementación del método abstracto que devuelve un Map con los valores contextuales a sustituir en el mensaje protected Map values() { HashMap values = new HashMap(); values.put("driverName",this.driverName); return values; } } ¿Cuándo utilizar BaseRuntimeException? ====================================== Como regla general, si el código cliente puede tratar la excepción o recuperarse de ella de alguna forma razonable, entonces dicha excepción debe extender BaseException. Si, por el contrario, el cliente no puede hacer nada con la excepción, entonces se puede extender BaseRuntimeException, de manera que no hará falta declararla en el API ni capturarla directamente en el código cliente. Para una explicación más detallada acerca de esta recomendación se puede visitar: http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html