在Spring MVC应用程序中,从异常日志记录更改为异常处理的最简单方法是什么?

Pea*_*chy 8 java spring exception-handling spring-mvc

我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

捕获并记录异常但不以其他方式处理.

fooService上面的调用做了同样的事情,从不向控制器抛出异常但捕获并记录它们.所以,实际上这个控制器异常代码永远不会被调用.

在我的应用程序中实现适当的异常处理的最佳和最简单的方法是什么?

Tom*_*icz 9

catch如果他们所做的一切都是不经意地记录的话,请删除所有陈述.catch是为了处理错误,而不是隐藏它.

一旦所有这些渔获物被去除,在Spring MVC(安装一个全局异常解析器1,2,3,...)简单地实现这个简单的界面:

public interface HandlerExceptionResolver {
    ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}
Run Code Online (Sandbox Code Playgroud)

在您的异常解析程序中,您可能只需将异常记录一次并将其作为未处理(返回null)进行处理,以便错误映射web.xml将请求转发到正确的错误页面.或者你可以自己处理异常并渲染一些错误页面.AFAIK在最简单的情况下不需要注册异常解析器,只需将其定义为Spring bean/annotate with @Service.

请记住,只有在您知道如何处理时才能捕获异常.记录仅用于故障排除,它不处理任何事情.

顺便说一下:

log.warn(e.getMessage(), e);
Run Code Online (Sandbox Code Playgroud)

不仅是一个非常差的异常处理,但它也略有不正确.如果您的异常没有消息,您将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]
Run Code Online (Sandbox Code Playgroud)

...有时候是不受欢迎的,特别是当异常消息很长时.


更新:编写自己的异常记录器时,请考虑实现org.springframework.web.servlet.HandlerExceptionResolverorg.springframework.core.Ordered.本getOrder()应该返回小东西(像0),使您的处理程序优先于内置的处理器.

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