捕获Java EE Web应用程序中的每个异常

时间:2009-08-12 15:40:36

标签: java logging java-ee exception-handling

首先,我为所有不可恢复的异常抛出运行时异常,这导致这些异常传递到容器,我目前使用错误页面(在web.xml中定义)。在此错误页面中是一个调用记录器的scriptlet。

我遇到的问题是在此调用时异常不再在堆栈上。我可以从请求范围变量(“javax.servlet.error.message”)访问它。该字符串是堆栈跟踪。我显然需要这个堆栈跟踪用于记录目的,并且出于安全原因,可以在不同的应用服务器“javax.error_message”关闭.......

所以我的问题是,如何在Java EE应用程序中最好地记录运行时异常而不包含所有内容:

try {} catch (Exception e) {logger.log(...)}

我想要某种方式从容器中调用记录器,也许......就在容器捕获异常之前,例如。

4 个答案:

答案 0 :(得分:3)

我找到了解决方案。通过添加响应过滤器并包装chain.doFilter(req,resp),如下所示:

try {
    chain.doFilter(req,resp);
} catch (Exception e) {
    logger.error("", e);
    throw new RuntimeException(e);
}

到目前为止工作正常,并且不依赖于特定的框架或应用服务器。

答案 1 :(得分:1)

在Servlet API中我没有任何知识可以实现这一点。

但是,您可以在Tomcat中使用实例侦听器执行此操作。您可以在context.xml中安装一个侦听器,如下所示,

<InstanceListener>myapp.MyListener</InstanceListener>

Tomcat在容器捕获异常之后并在它再次抛出异常之前立即触发InstanceEvent.AFTER_SERVICE_EVENT事件。您可以在那里调用记录器。

答案 2 :(得分:0)

如果我错了,请纠正我,但'exception'对象作为变量出现..在'error'jsp中称为'exception'。您始终可以使用此对象来记录检索异常信息并登录错误jsp本身。

答案 3 :(得分:0)

AOP (Aspect Oriented Programming)将是我的首选。

您定义:

  • 连接点(抛出运行时异常)。
  • 建议(您的代码记录异常)。
  • 切入点(你的应用程序的哪些部分正在“倾听”这个方面)。

查看http://www.aspectj.org/