La etiqueta<error-page> en web.xml no captura excepciones java.lang.Throwable
servlets custom-error-pages (2)
Tengo hoy el mismo problema. (JavaEE 7 y Glassfish 4.0)
El problema parece que el marco lo verifica como String en lugar de Class.
Verificación basada en cadenas (la hipótesis)
Cuando se produce una excepción, e.getClass()
se compara con <exception-type>
como cadena. Entonces no puedes usar herencia.
Tenga en cuenta que las clases anidadas deben señalarse como ''$'' en lugar de ''.'' (igual que el método getClass ()).
Cheque basado en clase
El marco crea una instancia de la clase, y el texto <exception-type>
refiere a él, y class.isInstance()
se usa para verificar.
Esto necesitará una reflexión y un archivo de política podría romperlo.
Espero que esta respuesta resuelva los problemas futuros.
Tengo una aplicación web desarrollada con servlet y JSP. Configuré mi aplicación para arrojar una IllegalArgumentException
si inserto parámetros incorrectos. Luego configuré mi archivo web.xml de esta manera:
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
Cuando me error.jsp
un 404 error
, funciona y llama a error.jsp
, pero cuando error.jsp
una java.lang.IllegalArgumentException
, no funciona y tengo una blank page
en blank page
lugar de error.jsp
. ¿Por qué?
El servidor es Glassfish, y los registros muestran realmente IllegalArgumentException rised.
No debes atraparlo ni suprimirlo, solo déjalo ir.
Es decir, no:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
doSomethingWhichMayThrowException();
} catch (IllegalArgumentException e) {
e.printStackTrace(); // Or something else which totally suppresses the exception.
}
}
Pero mejor déjalo ir:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doSomethingWhichMayThrowException();
}
O bien, si en realidad tiene la intención de atraparlo para el registro o así (prefiero usar un filtro para eso, pero ala), vuelva a lanzarlo:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
doSomethingWhichMayThrowException();
} catch (IllegalArgumentException e) {
e.printStackTrace();
throw e;
}
}
O bien, si no se trata de una excepción de tiempo de ejecución, ServletException
a ServletException
empaquetada en ServletException
, será ServletException
automáticamente por el contenedor:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
doSomethingWhichMayThrowException();
} catch (NotARuntimeException e) {
throw new ServletException(e);
}
}