JSP - Manejo de excepciones

En este capítulo. discutiremos cómo manejar excepciones en JSP. Cuando escribe un código JSP, puede cometer errores de codificación que pueden ocurrir en cualquier parte del código. Puede ocurrir el siguiente tipo de errores en su código JSP:

Excepciones marcadas

Una excepción marcada es una excepción que suele ser un error del usuario o un problema que el programador no puede prever. Por ejemplo, si se va a abrir un archivo, pero no se puede encontrar, se produce una excepción. Estas excepciones no pueden simplemente ignorarse en el momento de la compilación.

Excepciones de tiempo de ejecución

Una excepción de tiempo de ejecución es una excepción que probablemente el programador podría haber evitado. A diferencia de las excepciones marcadas, las excepciones en tiempo de ejecución se ignoran en el momento de la conformidad.

Errores

Estos no son excepciones en absoluto, sino problemas que surgen fuera del control del usuario o del programador. Los errores generalmente se ignoran en su código porque rara vez puede hacer algo al respecto. Por ejemplo, si se produce un desbordamiento de pila, surgirá un error. También se ignoran en el momento de la compilación.

Más adelante discutiremos formas de manejar las excepciones / errores de tiempo de ejecución que ocurren en su código JSP.

Usar objeto de excepción

El objeto de excepción es una instancia de una subclase de Throwable (por ejemplo, java.lang. NullPointerException) y solo está disponible en las páginas de error. La siguiente tabla enumera los métodos importantes disponibles en la clase Throwable.

S.No. Métodos y descripción
1

public String getMessage()

Devuelve un mensaje detallado sobre la excepción que se ha producido. Este mensaje se inicializa en el constructor Throwable.

2

public Throwable getCause()

Devuelve la causa de la excepción representada por un objeto Throwable.

3

public String toString()

Devuelve el nombre de la clase concatenada con el resultado de getMessage().

4

public void printStackTrace()

Imprime el resultado de toString() junto con el seguimiento de la pila para System.err, el flujo de salida de error.

5

public StackTraceElement [] getStackTrace()

Devuelve una matriz que contiene cada elemento del seguimiento de la pila. El elemento en el índice 0 representa la parte superior de la pila de llamadas y el último elemento de la matriz representa el método en la parte inferior de la pila de llamadas.

6

public Throwable fillInStackTrace()

Rellena el seguimiento de la pila de este objeto Throwable con el seguimiento de la pila actual, agregando a cualquier información anterior en el seguimiento de la pila.

JSP le ofrece una opción para especificar Error Pagepara cada JSP. Siempre que la página arroja una excepción, el contenedor JSP invoca automáticamente la página de error.

A continuación se muestra un ejemplo para especificar una página de error para un main.jsp. Para configurar una página de error, utilice el<%@ page errorPage = "xxx" %> directiva.

<%@ page errorPage = "ShowError.jsp" %>

<html>
   <head>
      <title>Error Handling Example</title>
   </head>
   
   <body>
      <%
         // Throw an exception to invoke the error page
         int x = 1;
         
         if (x == 1) {
            throw new RuntimeException("Error condition!!!");
         }
      %>
   </body>
</html>

Ahora escribiremos un Error Handling JSP ShowError.jsp, que se proporciona a continuación. Tenga en cuenta que la página de manejo de errores incluye la directiva<%@ page isErrorPage = "true" %>. Esta directiva hace que el compilador JSP genere la variable de instancia de excepción.

<%@ page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <p>Sorry, an error occurred.</p>
      <p>Here is the exception stack trace: </p>
      <pre><% exception.printStackTrace(response.getWriter()); %></pre>
   </body>
</html>

Acceder al main.jsp, recibirá una salida similar a la siguiente:

java.lang.RuntimeException: Error condition!!!
......

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

Uso de etiquetas JSTL para la página de error

Puede hacer uso de etiquetas JSTL para escribir una página de error ShowError.jsp. Esta página tiene casi la misma lógica que en el ejemplo anterior, con mejor estructura y más información:

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <table width = "100%" border = "1">
         <tr valign = "top">
            <td width = "40%"><b>Error:</b></td>
            <td>${pageContext.exception}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>URI:</b></td>
            <td>${pageContext.errorData.requestURI}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Status code:</b></td>
            <td>${pageContext.errorData.statusCode}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Stack trace:</b></td>
            <td>
               <c:forEach var = "trace" 
                  items = "${pageContext.exception.stackTrace}">
                  <p>${trace}</p>
               </c:forEach>
            </td>
         </tr>
      </table>

   </body>
</html>

Acceda al main.jsp, se generará lo siguiente:

Opps...

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Usando Try ... Catch Block

Si desea manejar errores dentro de la misma página y desea realizar alguna acción en lugar de activar una página de error, puede hacer uso de la try....catch bloquear.

A continuación se muestra un ejemplo simple que muestra cómo usar el bloque try ... catch. Pongamos el siguiente código en main.jsp -

<html>
   <head>
      <title>Try...Catch Example</title>
   </head>
   
   <body>
      <%
         try {
            int i = 1;
            i = i / 0;
            out.println("The answer is " + i);
         }
         catch (Exception e) {
            out.println("An exception occurred: " + e.getMessage());
         }
      %>
   </body>
</html>

Acceda a main.jsp, debería generar una salida similar a la siguiente:

An exception occurred: / by zero