如何在Java servlet Web应用程序中获取未捕获的exception

是否有一种标准的方法来捕获在诸如tomcat或Jetty之类的java servlet容器内发生的未捕获的exception? 我们运行了很多来自库的servlet,所以我们不能轻易地将我们放在try / catch代码上。 通过提供的API将我们的Web应用程序(在Jetty中运行)中的所有未捕获的exception捕获并记录到我们的错误跟踪器中也是很好的方法。

请不要我只需要记录例外,无论重定向是自定义错误页面的问题都无济于事。 我们通过GWT-RPC完成所有工作,因此用户永远不会看到错误页面。

我认为自定义filter实际上效果最好。

@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); } } } 

web.xml (部署描述符)中,您可以使用元素通过exception类型或HTTP响应状态代码指定错误页面。 例如:

  404 /error/404.html   com.example.PebkacException /error/UserError.html  

对于以NetBeans为中心的描述,请参阅配置Web应用程序:将错误映射到错误屏幕(Java EE 6教程) (或参阅Java EE 5教程的版本 )。

不是100%确定这是否适用于servlet容器,或者此调用需要向上游移动多远,但是您可以在Thread上调用静态 setDefaultUncaughtExceptionHandler方法来设置处理所有未捕获exception的处理程序。