全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 5 分钟 ✍️ juanwangdev

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信息

优先级规则总结

优先级处理方式
1Controller内@ExceptionHandler精确匹配
2Controller内@ExceptionHandler父类匹配
3@ControllerAdvice @ExceptionHandler精确匹配
4@ControllerAdvice @ExceptionHandler父类匹配
5@ResponseStatus注解
6DefaultHandlerExceptionResolver

多个@ControllerAdvice优先级

Java
@Order(1)
@RestControllerAdvice
public class HighPriorityHandler { ... }

@Order(2)
@RestControllerAdvice
public class LowPriorityHandler { ... }

// Order值越小优先级越高

要点总结

  • 异常类型匹配遵循精确优先、最近父类次之原则
  • Controller内@ExceptionHandler优先于全局
  • @Order控制多个@ControllerAdvice的优先级
  • @ResponseStatus由ResponseStatusExceptionResolver处理
  • Resolver链按注册顺序依次执行直到有返回值

📝 发现内容有误?点击此处直接编辑

← 上一篇 Spring Boot 全局异常处理原理
下一篇 → Spring Boot 统一响应体封装
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库