Usando una Página Global de Error

Cuando la aplicación debe mostrar la misma página de error para cualquier error de servidor o para una excepción no contemplada lanzada por un Action, un Servlet o una página JSP.

La solución es declarar una página global de error.

En web.xml usar el snippet siguiente:

<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>

En struts-config.xml usar el snippet siguiente:

<global-exceptions>
<exception key="error.general" type="java.lang.Exception" path="/error.jsp"/>
...
</global-exceptions>

El codigo de la página de error es del siguiente snippet:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" isErrorPage="true"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<html:html>
 <head>
 <title>Página General de Error</title>
 </head>
 <body>
 <div align="center">
 <c:choose>
 <c:when test="${not empty pageContext.exception}">
 <c:set var="problemType">Excepción JSP</c:set>
 <c:set var="appException" value="${pageContext.exception}" />
 <c:set var="causeException" value="${appException.cause}" />
 </c:when>
 <c:when test="${not empty requestScope['javax.servlet.error.exception']}">
 <c:set var="problemType">Excepción de Servlet</c:set>
 <c:set var="appException" value="${requestScope['javax.servlet.error.exception']}" />
 <c:set var="causeException" value="${appException.rootCause}" />
 </c:when>
 <c:when test="${not empty requestScope['org.apache.struts.action.EXCEPTION']}">
 <c:set var="problemType">Excepción de Framework Struts</c:set>
 <c:set var="appException" value="${requestScope['org.apache.struts.action.EXCEPTION']}" />
 <c:set var="causeException" value="${appException.cause}" />
 </c:when>
 <c:otherwise>
 <c:set var="problemType">Error no Contemplado en el Servidor</c:set>
 </c:otherwise>
 </c:choose>
 <table cellpadding="0" cellspacing="0" border="0" width="750">
 <tr>
 <td valign="top" colspan="2">
 <table cellpadding="4" cellspacing="0" border="0" width="100%">
 <tr valign="top">
 <td>
 <table cellpadding="4" cellspacing="0" border="0" width="100%">
 <tr>
 <td>
 <h2>
 Problema en el Sistema
 </h2>
 </td>
 </tr>
 </table>
 <table cellpadding="2" cellspacing="1" border="0" width="80%">
 <tr>
 <td colspan="2">
 Ocurrio un error en el sistema. Si el problema persiste, por favor p&oacute;ngase en contacto con el administrador de sistemas.
 </td>
 </tr>
 <tr>
 <td colspan="2">
 <html:errors />
 </td>
 </tr>
 <tr valign="top">
 <td>
 <b>Tipo de Problema</b>
 <br />
 <c:out value="${problemType}" />
 </td>
 <td>
 <b>Detalles del Problema</b>
 <c:if test="${not empty requestScope['javax.servlet.error.message']}">
 <br />
 <c:out value="${requestScope['javax.servlet.error.message']}" />
 </c:if>
 <c:if test="${not empty appException}">
 <br />
 <c:out value="${appException.message}" />
 &nbsp;
 </c:if>
 </td>
 </tr>
 <c:if test="${not empty causeException}">
 <tr>
 <td>
 <b>Origen del Problema</b>
 <br />
 <c:out value="${causeException}" />
 </td>
 <td>
 <b>Detalles</b>
 <br />
 <c:out value="${causeException.message}" />
 &nbsp;
 </td>
 </tr>
 </c:if>
 </table>
 <table id="MostrarDetallesLink" style="{display:inline}" cellpadding="2" cellspacing="1" border="0" width="80%">
 <tr>
 <td align="left">
 [ <a href="javascript:MostrarDetalles()"> Mostrar Detalles</a> ]
 </td>
 </tr>
 </table>
 <table id="OcultarDetallesLink" style="{display:none}" cellpadding="2" cellspacing="1" border="0" width="80%">
 <tr>
 <td align="left">
 [ <a href="javascript:OcultarDetalles()"> Ocultar Detalles</a> ]
 </td>
 </tr>
 </table>
 <div id="TrazaPila" style="{display:none}">
 <c:if test="${not empty appException}">
 <p></p>
 <table cellpadding="4" cellspacing="0" border="0" width="100%">
 <tr>
 <td>
 <h3>Traza de Pila de la Excepcion</h3>
 </td>
 </tr>
 </table>
 <b><c:out value="${appException}" /></b>
 <br />
 <table align="center" cellpadding="0" cellspacing="0" border="0" width="90%">
 <c:forEach var="stackItem" items="${appException.stackTrace}">
 <tr>
 <td><c:out value="${stackItem}" /></td>
 </tr>
 </c:forEach>
 </table>
 </c:if>
 <c:if test="${not empty causeException}">
 <p></p>
 <table cellpadding="4" cellspacing="0" border="0" width="100%">
 <tr>
 <td>
 <h3>Traza de Pila del Origen</h3>
 </td>
 </tr>
 </table>
 <b>
 <c:out value="${causeException}" /></b>
 <br />
 <table align="center" cellpadding="0" cellspacing="0" border="0" width="90%">
 <c:forEach var="stackItem" items="${causeException.stackTrace}">
 <tr>
 <td><c:out value="${stackItem}" /></td>
 </tr>
 </c:forEach>
 </table>
 </c:if>
 </div>
 </td>
 </tr>
 </table>
 </td>
 </tr>
 </table>
 <script language="javascript">
 function MostrarDetalles() {
 document.getElementById("MostrarDetallesLink").style.display = "none";
 document.getElementById("OcultarDetallesLink").style.display = "inline";
 document.getElementById("TrazaPila").style.display = "inline";
 }
 function OcultarDetalles() {
 document.getElementById("MostrarDetallesLink").style.display = "inline";
 document.getElementById("OcultarDetallesLink").style.display = "none";
 document.getElementById("TrazaPila").style.display = "none";
 }
 </script>
 </div>
 </body>
</html:html>

Si la excepcion tiene un origen, se pueden ver/ocultar los detalles haciendo clic en el enlace respectivo. Para manejar cualquier condicion de error, la página de error determina que clase de excepción ha sido lanzada. El bloque JSTL c:choose contiene la lógica que evalúa si el error es de tipo JSPException, ServletException o una excepción lanzada por Struts. Por cada tipo de excepción, la causa de la excepcion es recuperada. Esta versión de página de error es adecuada para un entorno de prueba y desarrollo.

Etiquetas:

Una respuesta to “Usando una Página Global de Error”

  1. Jeramy Says:

    Hola he alucinado con tu post no te conocía hoy. Mi más sincera
    felicitación tienes un sitio super interesante Gracias por compartir con todos.

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: