如何在Tomcat上拦截未捕获的异常?

时间:2008-12-21 15:26:10

标签: exception tomcat log4j

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

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

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

我熟悉JBoss上的LogInterceptors,但这个项目使用的是Tomcat。我有什么方法可以解决这个问题吗?是否有Tomcat的LogInterceptor equivelant?我应该尝试将Tomcat日志记录重定向到自定义appender吗? (如果是的话 - 任何提示?)其他一些想法?

我认为此已经成为现在解决的问题,所以我希望能够挖掘一些集体智慧。谢谢,大家,提前。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

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

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

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