Spring Boot 异常处理优先级
Spring Boot异常处理存在多层级优先级机制,理解优先级规则有助于正确设计异常处理策略。
@ExceptionHandler匹配优先级
异常类型匹配规则
| 优先级 | 规则 |
|---|---|
| 1 | 精确匹配异常类型 |
| 2 | 匹配最近父类异常 |
| 3 | 匹配Exception父类 |
Java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result<String> handleException(Exception e) {
return Result.fail(500, "系统异常");
}
@ExceptionHandler(RuntimeException.class)
public Result<String> handleRuntime(RuntimeException e) {
return Result.fail(500, "运行时异常");
}
@ExceptionHandler(NullPointerException.class)
public Result<String> handleNPE(NullPointerException e) {
return Result.fail(500, "空指针异常");
}
}
// NullPointerException -> 调用handleNPE(精确匹配)
// IllegalArgumentException -> 调用handleRuntime(最近父类)
// IOException -> 调用handleException(Exception匹配)
Controller级别优先级
Java
@RestController
public class UserController {
// Controller内部@ExceptionHandler优先于全局
@ExceptionHandler(UserNotFoundException.class)
public Result<String> handleUserNotFound(UserNotFoundException e) {
return Result.fail(1001, "Controller处理: " + e.getMessage());
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public Result<String> handleUserNotFound(UserNotFoundException e) {
return Result.fail(1001, "全局处理: " + e.getMessage());
}
}
// Controller内@ExceptionHandler优先执行
Controller内定义的@ExceptionHandler优先于@RestControllerAdvice中的同类异常处理。
HandlerExceptionResolver执行顺序
Java
public class CustomConfig implements WebMvcConfigurer {
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
// 默认顺序:
// 1. ExceptionHandlerExceptionResolver (@ExceptionHandler)
// 2. ResponseStatusExceptionResolver (@ResponseStatus)
// 3. DefaultHandlerExceptionResolver (Spring内置异常)
}
}
@ResponseStatus注解
Java
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "资源不存在")
public class ResourceNotFoundException extends RuntimeException {}
// 抛出异常时,ResponseStatusExceptionResolver处理
// 返回404状态码和reason信息
优先级规则总结
| 优先级 | 处理方式 |
|---|---|
| 1 | Controller内@ExceptionHandler精确匹配 |
| 2 | Controller内@ExceptionHandler父类匹配 |
| 3 | @ControllerAdvice @ExceptionHandler精确匹配 |
| 4 | @ControllerAdvice @ExceptionHandler父类匹配 |
| 5 | @ResponseStatus注解 |
| 6 | DefaultHandlerExceptionResolver |
多个@ControllerAdvice优先级
Java
@Order(1)
@RestControllerAdvice
public class HighPriorityHandler { ... }
@Order(2)
@RestControllerAdvice
public class LowPriorityHandler { ... }
// Order值越小优先级越高
要点总结
- 异常类型匹配遵循精确优先、最近父类次之原则
- Controller内@ExceptionHandler优先于全局
- @Order控制多个@ControllerAdvice的优先级
- @ResponseStatus由ResponseStatusExceptionResolver处理
- Resolver链按注册顺序依次执行直到有返回值
📝 发现内容有误?点击此处直接编辑