对于处理请求时抛出的异常,Spring 有许多不同的方法来注册异常处理程序。有没有办法在渲染视图时抛出异常时应用类似的异常处理?至少我希望能够执行一些日志记录。
问问题
1602 次
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"
不幸的是,异常不会向上传播到过滤器。我想添加我自己的日志记录,它会发送错误通知并记录有关失败请求的其他信息。密切关注日志文件以发现错误并不是一个好的选择。
日志消息实际上是使用日志子系统生成的。如果是,您可以使用日志配置为 JSP 引擎日志事件添加自己的处理程序并发送特殊通知。
异常是 1)在 JSP 视图呈现期间被抛出,以及 2)JSP 引擎没有传播它们的事实意味着(IMO)您不太可能有办法捕获它们。
另一种选择是为日志文件设置扫描仪......作为一般系统监控的一部分。
于 2012-12-16T05:16:34.093 回答