在 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.HandlerExceptionResolverorg.springframework.core.OrderedgetOrder() 应该返回一些小的东西(比如0),这样你的处理程序就优先于内置的处理程序。

我只是碰巧org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver 在我的处理程序之前运行返回 HTTP 500 而没有记录异常。

【讨论】:

以上是关于在 Spring MVC 应用程序中从异常记录更改为异常处理的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在spring mvc中从ajax调用jasperreport时出现解析器错误

在 Spring MVC 中从 Controller 显示视图(所有员工的列表)

在 Spring Boot 应用程序中防止自定义异常的堆栈跟踪日志记录

使用Spring AOP 记录Spring MVC请求日志

使用Spring AOP 记录Spring MVC请求日志

使用Spring AOP 记录Spring MVC请求日志