0

对于处理请求时抛出的异常,Spring 有许多不同的方法来注册异常处理程序。有没有办法在渲染视图时抛出异常时应用类似的异常处理?至少我希望能够执行一些日志记录。

4

1 回答 1

1

问题是视图渲染期间抛出的异常不能做很多事情。特别是,它们通常无法呈现包含错误报告的 HTML 页面……甚至无法发送 5xx 响应……因为响应通常在引发异常之前“已提交”。

所以你能做的最好的(可能)是:

  • 为捕获并记录异常的 View 对象创建一个包装器,或者
  • 在 servlet 过滤器中进行日志记录,

但是有可能 Web 容器可以配置为无论如何记录未捕获的异常。

更新

我刚刚注意到 Spring 的 HandlerInterceptor 类公开了一个 'afterCompletion' 方法,该方法将在引发异常时调用。关于使用这个与过滤器的好处的任何想法?

试试看。:-) 但鉴于以下情况,我怀疑它会起作用。

使用过滤器或拦截器不适用于呈现 jsp 时引发的异常。它确实打印出错误:

Dec 16, 2012 12:18:03 PM org.apache.catalina.core.ApplicationDispatcher 
    invoke SEVERE: Servlet.service() for servlet jsp threw exception
    javax.el.PropertyNotFoundException: Property 'fooo' not found on 
    type java.lang.String" 

不幸的是,异常不会向上传播到过滤器。我想添加我自己的日志记录,它会发送错误通知并记录有关失败请求的其他信息。密切关注日志文件以发现错误并不是一个好的选择。

  1. 日志消息实际上是使用日志子系统生成的。如果是,您可以使用日志配置为 JSP 引擎日志事件添加自己的处理程序并发送特殊通知。

  2. 异常是 1)在 JSP 视图呈现期间被抛出,以及 2)JSP 引擎没有传播它们的事实意味着(IMO)您不太可能有办法捕获它们。

  3. 另一种选择是为日志文件设置扫描仪......作为一般系统监控的一部分。

于 2012-12-16T05:16:34.093 回答