Manejo de excepciones en smartgwt

julio 8, 2009

En smartgwt utilizo RPC para la comunicación etre el cliente y el servidor. El paso de errores(Excepciones) del servidor hacia el cliente no se da por sí solo. Con ello me refiero a que si tenemos un método que arroje una excepción de tipo java.lang.Exception, lo cual no es lo recomendado, no podrá ser vista (leída) en el cliente -a pesar de que implementa la interfaz Serializable-
Por ejemplo, si tenemos el siguiente código en el servidor (que comunmente usamos para conectar a la BD):

public String helloException() throws Exception{
    Connection cn=DriverManager.getConnection("non-existent-driver");
    ...
}

y lo invocamos en el cliente

service.helloException (new AsyncCallback<String> () {
          public void onFailure (Throwable caught) {
              ...
              SC.warn("Error: "+ caught.getMessage(), null);
          }
          public void onSuccess (String result) {
              ...
          }
});

si sucede algún error, caught.getMessage() nos mostrara el mensaje “The call failed on the server; see server log for details”. Lo cual no nos dice absolutamente nada, más que algo falló en el servidor. Ahora revisemos el log para ver que sucedió.

[WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type ‘java.sql.SQLException’ was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.

Bueno, al menos ahora sabemos que ocurrió un SQLException, pero no podemos ver el detalle del mensaje.
Para ello necesitamos crear nuestra propia Excepcion serializable de la siguiente forma

public class UnknownException extends Exception implements IsSerializable {
    public UnknownException(){
    }
    public UnknownException(String message) {
        super(message);
    }
}

y modificamos el codigo en el servidor para que nos quede de la siguiente manera

public String helloException() throws UnknownException{
    try{
        Connection cn=DriverManager.getConnection("non-existent-driver");
        ...
    }catch(Exception exc){
        throw new UnknownException(exc.getMessage());
    }
}

de esta manera caught.getMessage() nos regresará el mensaje “No suitable driver found for non-existent-driver”, lo cual nos da una pista más clara de qué sucedió.
No necesariamente queremos mostrar estos mensajes al usuario, pero a la hora de debuguear nuestro código también tendremos acceso al mensaje de la excepción, cosa que antes no sucedía.

Finalmente, aunque nos requiera más trabajo, deberíamos crear nuestras propias excepciones.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: