Spring Boot 全局异常处理原理
Spring Boot通过DispatcherServlet的异常处理机制实现全局异常捕获,底层依赖HandlerExceptionResolver接口。
核心架构
异常处理流程
Java
请求 -> Controller -> 抛出异常 -> DispatcherServlet -> HandlerExceptionResolver链 -> 异常处理
DispatcherServlet捕获Controller层抛出的异常,依次调用已注册的HandlerExceptionResolver进行处理。
HandlerExceptionResolver接口
Java
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex);
}
内置Resolver
| Resolver | 作用 |
|---|---|
| ExceptionHandlerExceptionResolver | 处理@ExceptionHandler标注的方法 |
| DefaultHandlerExceptionResolver | 处理Spring标准异常 |
| ResponseStatusExceptionResolver | 处理@ResponseStatus注解异常 |
| SimpleMappingExceptionResolver | 配置式异常映射(传统方式) |
@ControllerAdvice注册原理
text
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handle(Exception e) {
return ResponseEntity.status(500).body(e.getMessage());
}
}
Spring启动时扫描@ControllerAdvice注解类,通过ControllerAdviceBean封装并注册到ExceptionHandlerExceptionResolver中。
ExceptionHandlerExceptionResolver在启动时解析所有@ExceptionHandler方法,建立异常类型到处理方法的映射表。
执行流程
- Controller方法执行抛出异常
- DispatcherServlet捕获异常
- 遍历HandlerExceptionResolver链
- ExceptionHandlerExceptionResolver匹配@ExceptionHandler方法
- 反射调用处理方法,返回响应
要点总结
- DispatcherServlet统一捕获Controller层异常
- HandlerExceptionResolver链式处理机制
- @ControllerAdvice通过ExceptionHandlerExceptionResolver注册
- 异常类型匹配采用最近父类原则
📝 发现内容有误?点击此处直接编辑