当程序中有异常时,异常会不断地向上抛出,SpringMVC可以进行统一的异常处理。用户就不会看到异常的页面。
一般有两种处理方式:
1️⃣ HandlerExceptionResolver(全局处理)
全局处理即只要异常抛出就进入该处理器
编写一个类继承HandlerExceptionResolver接口,重写方法resolveException,并使用@Component注解注册为组件,就可以使用了。
该方法的参数:
- handler:Handler方法
- exception:抛出的异常
该方法的返回值
- ModelAndView:最后处理后的ModelAndView
在该方法中可以根据抛出的异常不同,做个性化的处理
例如:
/**
* 只需要增加@Component则生效(只需要注册到容器中)
* handler方法向上抛出异常,则会执行到resovleException方法
*/
@Component
public class CustomHandlerExceptionResolver implements HandlerExceptionResolver {
/**
*
* @param handler → Handler方法
* @param exception → 向上抛出的异常对应
* @return ModelAndView → 最后处理后的ModelAndView
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception exception) {
ModelAndView modelAndView = new ModelAndView("/WEB-INF/exception.jsp");
//根据抛出的异常不同,做个性化的处理 → 异常类型的不同
if (exception instanceof SensitiveWordException) {
SensitiveWordException sensitiveWordException = (SensitiveWordException) exception;
String word = sensitiveWordException.getWord();//从handler方法中抛出的异常对象封装的
String message = sensitiveWordException.getMessage();
modelAndView.setViewName("/WEB-INF/sensitive.jsp");
modelAndView.addObject("word", word);
modelAndView.addObject("messagez", message);
}
return modelAndView;
}
}
其中的sensitiveWordException是我=一个自定义的异常类,继承自Exception类
2️⃣ ExceptionHandler(映射方式)(推荐)
建立异常和Handler之间的映射,比之前的方法灵活
可以根据异常的类型不同直接映射到不同的方法上
建立一个类,在类上使用@ControllerAdvice注解,这个类中的方法用@ExceptionHandler注解标记,value值为一个异常类型的数组
例如:
@ControllerAdvice //使用该注解,才能够使用ExceptionHandler
//@RestControllerAdvice
public class ExceptionController {
//方法的写法和HandlerMethod写法一毛一样
@ExceptionHandler(ArithmeticException.class)
public String exception(ArithmeticException exception){ //ModelAndView
return "/WEB-INF/exception.jsp";
}
@ExceptionHandler(SensitiveWordException.class)
@ResponseBody
public BaseRespVo sensitive(SensitiveWordException exception){ //json
String message = exception.getMessage();
return BaseRespVo.fail(message);
}
}