一、spring实现统一异常处理:在用springmvc做项目时,Dao和Service层的异常都会被抛到Controller层,如果我们在每个Controller的方法中都加上异常的try...catch处理就显的非常繁琐。所以springmvc为我们提供了统一的异常处理方案,可以把controller层的异常进行统一处理,这样既提高了代码的复用性也让异常处理代码和我们的业务代码解耦。
springmvc提供了两种方法 详情如下:
方法一、实现HandlerExceptionResolver接口:
@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) {
String msg = e.getMessage();
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg",msg);
modelAndView.setViewName("error.jsp");
return modelAndView;
}
}
方法二、使用@ControllerAdvice注解创建类【现在一般都是用这个方法】:
@Component
@ControllerAdvice
public class MyControllerAdvice {
//1、自定义要处理的异常
//NullPointerException.class
// ArrayIndexOutOfBoundsException.class
//ArithmeticException.class
//2、自定义返回值类型
@ExceptionHandler({NullPointerException.class,ArrayIndexOutOfBoundsException.class,ArithmeticException.class})
public ModelAndView handerException(Exception e){
String msg=e.getMessage();
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg",msg);
modelAndView.setViewName("error.jsp");
return modelAndView;
}
}
二、总结:
我们在实际项目开发中一般会选择使用@ControllerAdvice来进行异常的统一处理。
因为如果在前后端分离的项目中,异常处理一般是跳转到错误页面,让用户有更好的体。而且前后端分离的项目中,异常处理一般是把异常信息封装到json中写入响应体,无论是哪种情况,使用@ControllerAdvice的写法都能比较方便的实现。
@ControllerAdvice因可以自定义异常类型,可以自定义返回值类型,总之比较灵活。
而HandlerExceptionResolver不够灵活。