2011-09-14 24 views
13

¿Hay una forma estándar de detectar excepciones no detectadas que ocurren dentro de un contenedor de servlets java como tomcat o Jetty? Ejecutamos muchos servlets que provienen de bibliotecas, por lo que no podemos poner fácilmente nuestro código try/catch. También sería bueno acceder de la forma más genérica posible a la captura y registrar todas las excepciones no detectadas en nuestra aplicación web (que se ejecuta en Jetty) en nuestro rastreador de errores a través de la API provista.Cómo capturar excepciones no detectadas en una aplicación web de servlet de Java

Por favor, no necesito registrar las excepciones solamente, si una redirección es un problema para una página de error personalizada no me ayudará. Hacemos todo a través de GWT-RPC para que el usuario nunca vea una página de error.

Respuesta

11

En web.xml (el descriptor de despliegue) puede usar el elemento <error-page> para especificar páginas de error por tipo de excepción o HTTP response status code. Por ejemplo:

<error-page> 
    <error-code>404</error-code> 
    <location>/error/404.html</location> 
</error-page> 
<error-page> 
    <exception-type>com.example.PebkacException</exception-type> 
    <location>/error/UserError.html</location> 
</error-page> 

Para una descripción NetBeans-céntrico, mosey de más a Configuring Web Applications: Mapping Errors to Error Screens (The Java EE 6 Tutorial) (o ver the Java EE 5 Tutorial's version).

+3

Vale la pena señalar que el código de manejo de errores servlet puede recuperar la excepción del objeto 'request' en el atributo' javax.servlet.error.exception'. Por ejemplo, 'request.getAttribute (" javax.servlet.error.exception ")' – nilskp

3

No es 100% seguro de si esto va a funcionar con un contenedor de servlets, o hasta qué punto aguas arriba esta llamada tendría que ir, pero se puede llamar al método estático setDefaultUncaughtExceptionHandler en Thread para configurar un controlador que se encargará de todas las excepciones no capturadas .

13

Creo que un filtro personalizado realmente funciona mejor.

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    try { 
     chain.doFilter(request, response); 
    } catch (Throwable e) { 
     doCustomErrorLogging(e); 
     if (e instanceof IOException) { 
      throw (IOException) e; 
     } else if (e instanceof ServletException) { 
      throw (ServletException) e; 
     } else if (e instanceof RuntimeException) { 
      throw (RuntimeException) e; 
     } else { 
      //This should never be hit 
      throw new RuntimeException("Unexpected Exception", e); 
     } 
    } 
} 
+2

La publicación sobre el uso de 'error-page' es la forma correcta de hacerlo en un entorno de servlet. – nilskp

+1

En realidad, la solución javax.servlet.Filter anterior funciona muy bien en un entorno de servlet. Y me gusta el hecho de que no tenemos que editar el web.xml para ello. – David

+0

este ejemplo causaría el efecto secundario de detectar errores (una subclase que no es excepción de throwable y convertirlos en Excepciones). Dado que los errores son problemas internos relacionados con la propia JVM (como OutOfMemoryError o ThreadDeath). Como la propia JVM necesita manejar errores, es una mala práctica atrapar throwables y convertirlos a una excepción que no será manejada por la JVM apropiadamente. (http://stackoverflow.com/questions/6083248/is-it-a-bad-practice-to-catch-throwable) –

Cuestiones relacionadas