在 Spring MVC 应用程序中从异常记录更改为异常处理的最简单方法是啥?
Posted
技术标签:
【中文标题】在 Spring MVC 应用程序中从异常记录更改为异常处理的最简单方法是啥?【英文标题】:What's the simplest way to change from exception logging to exception handling in a Spring MVC app?在 Spring MVC 应用程序中从异常记录更改为异常处理的最简单方法是什么? 【发布时间】:2011-09-27 18:09:13 【问题描述】:我的 Spring MVC 应用充满了如下所示的方法:
@RequestMapping(value = "/foo", method = RequestMethod.GET)
public final void foo(HttpServletRequest request, ModelMap modelMap)
try
this.fooService.foo();
catch (Exception e)
log.warn(e.getMessage(), e);
异常会被捕获并记录下来,但不会以其他方式处理。
上面调用的fooService
做同样的事情,从不向控制器抛出异常,而是捕获并记录它们。所以,实际上这个控制器异常代码永远不会被调用。
在我的应用中实现正确的异常处理的最佳和最简单的方法是什么?
【问题讨论】:
【参考方案1】:如果所有catch
语句只是粗心地记录,请删除它们。 catch
用于处理错误,而不是隐藏它。
删除所有这些捕获后,在 Spring MVC 中安装一个全局异常解析器(1,2,3,...)只需实现这个简单的接口:
public interface HandlerExceptionResolver
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
在您的异常解析器中,您可能只需将异常记录一次并让它未处理(返回null
),以便web.xml
中的错误映射将请求转发到正确的错误页面。或者您可以自己处理异常并呈现一些错误页面。 AFAIK 在最简单的情况下不需要注册异常解析器,只需将其定义为带有 @Service
的 Spring bean/注释。
请记住,只有在您知道如何处理时才捕获异常。日志记录仅用于故障排除,它不处理任何事情。
顺便说一句:
log.warn(e.getMessage(), e);
不仅是一个非常糟糕的异常处理,而且它也有点不正确。如果您的异常没有消息,您将在堆栈跟踪之前看到神秘的null
。如果是,则消息将出现两次(使用 Logback 测试):
22:51:23.985 WARN [main][Foo] OMG! - this is the exception message
java.lang.IllegalStateException: OMG! - this is the exception message
at Foo.bar(Foo.java:20) ~[test-classes/:na]
...有时不受欢迎,尤其是当异常消息很长时。
更新:在编写自己的异常记录器时,请考虑同时实现org.springframework.web.servlet.HandlerExceptionResolver
和org.springframework.core.Ordered
。 getOrder()
应该返回一些小的东西(比如0
),这样你的处理程序就优先于内置的处理程序。
我只是碰巧org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
在我的处理程序之前运行返回 HTTP 500 而没有记录异常。
【讨论】:
以上是关于在 Spring MVC 应用程序中从异常记录更改为异常处理的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在spring mvc中从ajax调用jasperreport时出现解析器错误
在 Spring MVC 中从 Controller 显示视图(所有员工的列表)