CUANDO TODO VA MAL… (I)
Excepciones en JAVA, que son, ¿como las controlamos?
Cualquier programador intenta no cometer ningún tipo de error al “picar código”, pero la dura realidad es que por muy bueno que seamos, los cometemos, para ello JAVA nos facilita una serie de clases para manipular excepciones, en los que podremos manipular tanto los propios errores que podamos cometer de lógica, como los derivados de un procesamiento condicional… huy que lio, vamos a explicarlo mejor.
Que salte una excepción no tiene porque ser síntoma de un error, necesariamente. Es simplemente una herramienta que nos facilita JAVA para localizar acontecimientos que requieren una atención especial, y un mecanismo que permita que el programa no falle.
Podemos tratar con las clases genéricas de las que disponemos, o bien crear las nuestras propias. Si son excepciones comunes, como controlar un null por ej, pues nos valdría con las que disponemos la clase Throwable, pero si necesitamos algo más complejo, reutilizable, y personalizado, os aconsejo crear la nuestra propia. Más adelante veremos unos ejemplos.
Podemos tener varios tipos de Excepciones:
- Error de compilación. Si el código que introdujimos no era el correcto, por un error de sintaxis, de una simple coma que se nos cuele, JAVA se quejará y no será posible compilar. Suele ser un error de fácil lectura, puesto que se nos indica la línea y el carácter que originó el error. Un consejo para prevenir, todos los IDE tienen atajos a la hora de escribir los comandos, y desplegables que son muy útiles.
- Error en tiempo de ejecución. Hemos conseguido c ompilar nuestro programa, pero al ejecutarlo nos da error. Esto es porque por ejemplo, declaramos en nuestra BBDD un dato como String, y en el programa lo pasamos como Int. Son errores difíciles de detectar, porque nos obligan a estudiar el programa detenidamente.
Para hacernos más liviana la tarea, como decía, JAVA nos facilita una serie de clases donde podremos capturar las Excepciones, y decirle a nuestro programa como debe de actuar.
Todas ellas son Subclases de la clase Throwable. Cuando se emite una excepción, se crea un objeto derivado de esta clase, y se le pasa a la Máquina Virtual de Java para que la trate, con la palabra reservada Throw.
Las dos Subclases principales de Throwable son Error y Exception. Siendo la primera para tratar errores que causarían una interrupción en el programa, mientras que Exception nos permitirá recogerla y tratarla siguiendo con el flujo del programa.
Estructura básica de un bloque try-catch-finally
try {
// aquí incluiremos todo el código que pensemos que nos puede dar errores en tiempo de ejecución. Lo envolvemos todo entre los paréntesis.
}
catch (Excepcion e1) {
// En caso de que salte una excepción, le especificaremos de que manera vamos actuar.
}
finally {
// bloque de código que siempre se ejecutará aunque haya habido excepciones, por ejemplo cerrar un archivo
}
Bien vamos a ver un ejemplo sencillo de una excepción en una JSP, en donde vamos a intentar dividir un número entre 0.
<%@page contentType=”text/html” pageEncoding=”UTF-8″%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
“http://www.w3.org/TR/html4/loose.dtd“>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<title>JSP Page</title>
</head>
<body>
<%
int i=10; // declaramos unas variables de tipo entero, las damos
int j=0; // el valor y le hacemos la division…
try{
// i = i/j; //
}catch (Exception e) {
out.println(”Ha ocurrido el siguiente error:<br>”);
out.println(e.toString());
}
%>
<p>El valor de i es <%=i%></p>
</body>
</html>
Descifrando mensajes de error.
Como consecuencia de realizar esa operación, veremos un esperado A Servlet Exception Has Ocurred, junto con el detonante de la excepción: java.lang.ArithmeticException.
Técnicamente a este mensaje se le conoce como una traza de pila:
Java.lang.ArithmeticException: /by zero
At org.apache.jsp.error_0005fno0005fcatch_jsp._jspService
(error_0005fno_0005fcatch_jsp.java:62)
at org.apache.jasper.runtime.HttpJspBase.java:107
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:200)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:453)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
Bien, vamos a entender un poco este mensaje, que nos será de gran ayuda a la hora de determinar las causas de error.
Para empezar podemos ver cuál es la excepción remitida, en el ejemplo este es fácil, no indica que ha sido una “división entre 0”.
Lo siguiente que nos indica es donde ocurrió el error. Como ya sabéis, cuando una JSP se ejecuta, se convierte en un Servlet (código JAVA) y es aquí donde ocurre el error, no en la JSP (ya sabéis, lo de “lado del cliente, y del servidor”). Bien ya sabemos donde ocurrió el error, ahora queda ver en la que línea se originó: 62 (error_0005fno_0005fcatch_jsp.java:62).
Si exploramos nuestra JSP, veremos que la línea 62 corresponde a i =i / j ; Bien pues con esto ya sabríamos localizar que parte de nuestro código es el que falló.
Este es un tema bastante largo, a la vez que interesante e útil, por lo que están casi apunto la continuación del artículo. Crear nuestra propia clase Exception, Depurar Errores usando Mozilla.
Marcos.