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.
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:
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