目录
2.2 @ControllerAdvice+@ExceptionHandler处理全局异常
一、默认规则
- 默认情况下,Spring Boot提供
/error
处理所有错误的映射 - 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据
二、自定义异常处理
2.1 自定义错误页
在template目录下创建error目录,里面创建错误页面,如 404.html、5xx.html,springboot在遇到错误时会自动到error目录下匹配错误页面:
有精确错误状态码页面就匹配精确;没有就模糊匹配,如 4xx.html;如果都没有就触发白页
2.2 @ControllerAdvice+@ExceptionHandler处理全局异常
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({ArithmeticException.class,NullPointerException.class}) //处理异常
public String handleArithException(Exception e){
return "login"; //视图地址
}
}
@Exceptionhandler注解内的参数是想要处理的异常类型。
2.3 @ResponseStatus+自定义异常
在处理器方法内自定义一个异常:
throw new userTooManyException();
@ ResponseStatus 标注的
@ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用户数量太多")
public class UserTooManyException extends RuntimeException {
public UserTooManyException(){
}
public UserTooManyException(String message){
super(message);
}
}
三、异常处理的原理
3.1 相关配置与组件
ErrorMvcAutoConfiguration 会自动配置异常处理规则。
组件:1. DefaultErrorAttributes,定义错误页面中可以包含哪些数据,
2. BasicErrorController :处理默认 /error 路径的请求;期间产生一个 View(名字为error的视图,即响应默认错误页),被BeanNameViewResolver视图解析器解析,最终响应一个 ModelAndView。最后渲染错误页面(json/百页)
3. DefaultErrorViewResolver :如果发生错误,会以HTTP状态码作为视图页地址(viewName),找到真正的页面,如error/404、5xx.html
3.2 异常处理流程
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 处理