目录
2.2 @ControllerAdvice+@ExceptionHandler处理全局异常
/error处理所有错误的映射

在template目录下创建error目录,里面创建错误页面,如 404.html、5xx.html,springboot在遇到错误时会自动到error目录下匹配错误页面:
有精确错误状态码页面就匹配精确;没有就模糊匹配,如 4xx.html;如果都没有就触发白页
- @ControllerAdvice
- public class GlobalExceptionHandler {
-
- @ExceptionHandler({ArithmeticException.class,NullPointerException.class}) //处理异常
- public String handleArithException(Exception e){
- return "login"; //视图地址
- }
- }
@Exceptionhandler注解内的参数是想要处理的异常类型。
在处理器方法内自定义一个异常:
throw new userTooManyException();
@ ResponseStatus 标注的
- @ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用户数量太多")
- public class UserTooManyException extends RuntimeException {
-
- public UserTooManyException(){
-
- }
- public UserTooManyException(String message){
- super(message);
- }
- }
ErrorMvcAutoConfiguration 会自动配置异常处理规则。
组件:1. DefaultErrorAttributes,定义错误页面中可以包含哪些数据,

2. BasicErrorController :处理默认 /error 路径的请求;期间产生一个 View(名字为error的视图,即响应默认错误页),被BeanNameViewResolver视图解析器解析,最终响应一个 ModelAndView。最后渲染错误页面(json/百页)
3. DefaultErrorViewResolver :如果发生错误,会以HTTP状态码作为视图页地址(viewName),找到真正的页面,如error/404、5xx.html
1、执行目标方法,目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 dispatchException保存异常。
2、进入视图解析流程
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
modelAndView由 processHandlerException产生:处理handler发生的异常,处理完成返回ModelAndView;
2.1 遍历所有的 handlerExceptionResolvers异常解析器,看谁能处理当前异常
2.2 系统默认的异常解析器;

2.2.1 DefaultErrorAttributes先来处理异常。把异常信息保存到request域,并且返回null;
2.2.2 默认没有任何人能处理异常,所以异常会被抛出!!
1)若没有无法能处理,底层会发送 /error 请求。交给BasicErrorController处理
2)遍历所有的 ErrorViewResolver 看谁能解析。
3)默认的 DefaultErrorViewResolver 会把响应状态码作为错误页的地址,转到error/4xx.html页面(没找到的话就输出百页)
4)模板引擎最终响应错误页面
2.2.3 假如我们自定义了错误处理逻辑(非定义error页面),如:
处理全局异常,底层由ExceptionHandlerExceptionResolver支持。类似于处理正常的请求;
处理自定义异常:底层由 ResponseStatusExceptionResolver支持,通过给Tomcat再次发送请求,请求为/error;
框架底层的异常如参数类型转换异常:由DefaultHandlerExceptionResolver 处理