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

有没有一种标准的方法来捕获在java servlet容器(如tomcat或Jetty)中发生的未捕获的异常?我们运行了很多来自库的servlet,所以我们不能轻易地把我们的试/捕获代码。通过提供的API,以尽可能通用的方式捕获我们的Web应用程序(在Jetty中运行)中所有未捕获的异常并将其记录到我们的错误跟踪器中,这也是很好的。

请不要我只需要记录异常,无论重定向到自定义错误页面的问题都不会帮助我。我们通过GWT-RPC执行所有操作,因此用户永远不会看到错误页面。


答案 1

我认为自定义过滤器实际上效果最好。

@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

在(部署描述符)中,可以使用 <错误页>元素按异常类型或 HTTP 响应状态代码指定错误页。例如:web.xml

<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>

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


推荐