【问题标题】:How can I intercept uncaught exceptions on Tomcat?如何在 Tomcat 上拦截未捕获的异常?
【发布时间】:2008-12-21 15:26:10
【问题描述】:

我正在尝试找出一种干净的方法来拦截我的应用程序中发生的未捕获异常。

我已将 log4j 配置为记录正常的应用程序流并捕获异常,因此已得到处理。现在,我有一个类,它接收所有错误级别的消息并将它们添加到队列中,以便分批通过电子邮件发送。

理想情况下,我希望有一种方法可以拦截未捕获的异常,以便将它们传递到同一个“电子邮件批处理”队列,但如果这不可行,我当然愿意建议。

我熟悉 JBoss 上的 LogInterceptors,但这个项目使用的是 Tomcat。有什么办法可以解决这个问题吗? Tomcat 是否有 LogInterceptor 等价物?我应该尝试将 Tomcat 日志重定向到自定义附加程序吗? (如果是这样 - 有什么提示吗?)还有其他想法吗?

我认为这个现在应该是一个已解决的问题,所以我希望挖掘一些集体智慧。提前谢谢大家。

【问题讨论】:

    标签: exception tomcat log4j


    【解决方案1】:

    根据 J2EE 1.4 规范,servlet 中未捕获的异常可能会被转发到部署描述符中定义的错误页面。发生这种情况时,页面实现将接收原始请求和响应对象,并添加一个名为 javax.servlet.error.exception 的请求属性,其中包含异常对象。

    也就是说,我实际上并没有使用 Tomcat 完成此操作,而且我处理过的大多数 Web 应用程序都转发到 Web 服务器级别的通用错误页面。

    编辑:刚刚在我的本地服务器上尝试过,将以下内容添加到我的 web.xml 后,它可以像宣传的那样工作:

    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/dumpRequest.jsp</location>
    </error-page>
    

    【讨论】:

      【解决方案2】:

      它不是 Tomcat 特定的,但您可以set uncaught exception handlers on a per-thread basis

      根据您的应用程序的设置,您可以在处理请求的方法的顶部设置它。您可能必须每次都这样做,因为您可能会为每个请求获得一个线程。

      设置它的好地方是在某种前端控制器中。

      【讨论】:

      • 我想这不会起作用,因为即使您的应用程序没有,tomcat 也会捕获所有异常。如果它的线程池中没有线程,它将继续死于 webapp 错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2011-05-13
      • 2015-03-16
      相关资源
      最近更新 更多