说明
在开发中,会遇到一些错误、异常,如:404找不到资源,500服务器报错
而且,如果浏览器发来请求,就返回 HTML 页面;如果 AJAX、客户度发来请求,就返回 JSON
所以我们一般要实现异常处理,即:一个类、或几个类就能统一处理异常
springboot、springmvc有多种方式处理异常:
※ @ControllerAdvice 和 @ExceptionHandler:增强控制器中实现异常处理方法,详见 链接
※ @RestControllerAdvice 和 @ExceptionHandler:增强控制器中实现异常处理方法,详见 链接
※ BasicExceptionController(ErrorController接口):SpringBoot默认处理异常方式,在没有配置任何异常处理时,SpringBoot就是使用该方式处理异常的。SpringBoot兜底的处理异常方式,可处理 404、500、过滤器抛错。详见 链接
@ExceptionHandle:只能在controller中定义异常处理方法,详见 链接
SimpleMappingExceptionResolver:拦截异常跳转到error页面,使用较少
HandlerExceptionResolver:springmvc框架使用较多,springboot 使用较少,详见 链接
执行顺序
上面处理异常的方式有很多,当controller抛错时,执行顺序是:
controller -> controller内的@ExceptionHandle修饰的方法 -> @ControllerAdvice、@RestControllerAdvice修饰的类的@ExceptionHandle修饰的方法 -> interceptor -> filter -> BasicExceptionController
- 当controller抛错,如果该controller有
@ExceptionHandle修饰的方法,就有该方法处理 - 分两种情况:
- 如果该controller 没有
@ExceptionHandle修饰的方法,就由@ControllerAdvice、@RestControllerAdvice修饰的类的@ExceptionHandle修饰的方法处理 - 如果该controller 中,
@ExceptionHandle修饰的方法报错,就由BasicExceptionController处理(忽略@ControllerAdvice、@RestControllerAdvice修饰的类)
- 如果该controller 没有
- 如果
@ControllerAdvice、@RestControllerAdvice修饰的类的@ExceptionHandle修饰的方法报错,就由BasicExceptionController处理 - 如果拦截器报错,就由
BasicExceptionController处理 - 如果过滤器报错,就由
BasicExceptionController处理
总之:BasicExceptionController 是兜底的异常处理
参考:
https://blog.csdn.net/flyer5/article/details/103836207
https://www.jianshu.com/p/ec932d6091c1