一、异常处理重要组件
(1)DefaultErrorAttributes:将错误信息放入Request域中。
(2)BasicErrorController:根据客户端的类型返回对应数据,如浏览器则返回页面,机器则返回JSON。
(3)DefaultErrorViewResolver(默认的异常视图解析器):将error/和状态码拼接在一起,根据拼接结果找到该视图解析器,然后创建对应视图对象。
二、异常处理流程
(1)DispatchServlet执行控制器方法时捕获到异常,遍历寻找异常解析器处理异常。
(1)DefaultErrorAttributes:将错误信息放入Request域中。
(2)ExceptionHandlerExceptionResolver:标注了@ControllerAdvice的控制器中的标注了@ExceptionHandler的方法处理异常。
(3)ResponseStatusExceptionResolver:处理标注了@ResponseStatus注解的异常。
(4)DefaultHandlerExceptionResolver:SpringMVC处理底层异常。
上述异常解析器配置:
(2)ExceptionHandlerExceptionResolver
@Slf4j
@ControllerAdvice
public class MyExceptionController {
@ExceptionHandler({ArithmeticException.class, ArrayIndexOutOfBoundsException.class})
public String handlerAllException(Exception e){
log.info(e.toString());
return "okok";
}
}
(3)ResponseStatusExceptionResolver
@ResponseStatus(code = HttpStatus.FORBIDDEN, reason = "我就是喜欢出来")
public class MyException extends Exception{
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
(2)判断上述异常解析器是否有返回ModelAndView对象,不为空则找到对应视图解析器来创建对应视图对象,再调用其渲染方法;为空则SpringMVC进行请求转发/error,然后调用BasicErrorController中对应的控制器方法。
三、自定义异常解析器(注意设置优先级)
@Slf4j
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
log.info(e.toString());
//交给异常控制器处理/error
try {
httpServletResponse.sendError(411, "gogo");
} catch (IOException ioException) {
ioException.printStackTrace();
}
return new ModelAndView();
}
}