6

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

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

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

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

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

4

2 回答 2

5

根据 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>
于 2008-12-21T15:45:17.247 回答
1

它不是 Tomcat 特定的,但您可以在每个线程的基础上设置未捕获的异常处理程序

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

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

于 2008-12-21T15:51:43.817 回答