【问题标题】:How to grab uncaught exceptions in a Java servlet web application如何在 Java servlet Web 应用程序中抓取未捕获的异常
【发布时间】:2011-09-14 01:47:20
【问题描述】:

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

请不要我只需要记录异常,是否重定向到自定义错误页面对我没有帮助。我们通过 GWT-RPC 完成所有操作,因此用户永远不会看到错误页面。

【问题讨论】:

    标签: java exception-handling jetty uncaught-exception


    【解决方案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);
            }
        }
    }
    

    【讨论】:

    • 关于使用error-page 的帖子是在servlet 环境中执行此操作的正确方法。
    • 实际上,上面的 javax.servlet.Filter 解决方案在 servlet 环境中工作得很好。而且我喜欢我们不必为它编辑 web.xml 的事实。
    • 这个例子会导致捕获错误(throwable 的非异常子类并将它们转换为异常)的副作用。因为错误是与 JVM 本身相关的内部问题(如 OutOfMemoryError 或 ThreadDeath)。由于 JVM 本身需要处理错误,因此捕获 throwable 并将它们转换为 JVM 无法正确处理的异常是一种不好的做法。 (stackoverflow.com/questions/6083248/…)
    【解决方案2】:

    web.xml(部署描述符)中,您可以使用<error-page> 元素按异常类型或HTTP response status code 指定错误页面。例如:

    <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 为中心的描述,请继续关注 Configuring Web Applications: Mapping Errors to Error Screens (The Java EE 6 Tutorial)(或参阅 the Java EE 5 Tutorial's version)。

    【讨论】:

    • 值得指出的是,错误处理servlet代码可以从javax.servlet.error.exception属性中的request对象中检索异常。例如:request.getAttribute("javax.servlet.error.exception")
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多