当前位置: 首页 > news >正文

@ExceptionHandler 默认无法拦截 Aspect(切面)中抛出的异常

@ExceptionHandler 默认无法拦截 Aspect(切面)中抛出的异常

原因

Spring 的 @ExceptionHandler 是通过 DispatcherServlet 和 @ControllerAdvice 处理的,属于 MVC 层的异常处理。但 Aspect(切面)的代码是在 代理对象 中执行的,它的异常会先于 Controller 方法抛出,导致 @ExceptionHandler 无法捕获。

  • 如果异常是从 @Aspect 类抛出的,它会直接绕过 DispatcherServlet 的异常处理机制。
  • @ExceptionHandler 只能处理 Controller 方法内部 或 Filter/Interceptor 层 抛出的异常。

解决方案

  • 原则
场景异常处理方式
Aspect 直接抛出异常需在 Aspect 内部处理
Controller 方法抛出异常@ExceptionHandler 可以捕获
Filter/Interceptor 抛出异常需通过 @ControllerAdvice 处理
  • 在 Aspect 内部直接捕获并处理异常

  • 重新抛出异常,让 Controller 层处理,最终由 @ExceptionHandler 处理

  • 如果异常是从 Controller 方法内部抛出的(但经过 Aspect 增强),可以通过 @Order 控制执行顺序:

    @ControllerAdvice
    @Order(Ordered.HIGHEST_PRECEDENCE) // 确保优先级高于 AOP 切面
    public class GlobalExceptionHandler {
    }
    

结论

  • 如果异常是从 Aspect 直接抛出的:优先在 Aspect 内部处理。
  • 如果异常是从 Controller 方法抛出的:确保 @ExceptionHandler 或 @ControllerAdvice 能覆盖到。
  • 调整执行顺序:通过 @Order 控制切面和异常处理的优先级。
http://www.xdnf.cn/news/922843.html

相关文章:

  • centos7编译安装LNMP架构
  • docker安装RabbitMQ
  • 一些因子的解释
  • 人工智能--AI换脸
  • iview框架主题色的应用
  • WebWorker-----高频面试题(浏览器篇)
  • 【每天一道算法题】用JavaScript实现的字符串比较算法
  • 【云架构】
  • 后端下载限速(redis记录实时并发,bucket4j动态限速)
  • Java 常用 API 分类总结(算法竞赛考前速记篇)- 适用于算法竞赛(如 CCF CSP、蓝桥杯、NOI)
  • 【PhysUnits】15.17 比例因子模块 (ratio.rs)
  • 河南建筑安全员B证考试最新精选题
  • Python 函数全攻略:函数基础
  • JavaSec-SpringBoot框架
  • JAVA理论第三章-多线程
  • Python实例题:Python计算微积分
  • 2025年06月07日Github流行趋势
  • go语言学习 第9章:映射(Map)
  • 推客系统小程序开发:告别低效推广,开启精准获客新时代
  • C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)
  • 25N60-ASEMI电源管理领域专用25N60
  • 基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
  • 【CSS-4】掌握CSS文字样式:从基础到高级技巧
  • Qt/C++学习系列之Excel使用记录
  • 第二部分 方法,还是方法——“信管法则”的四大要点
  • 高保真组件库:数字输入框
  • FlashAttention 公式推导
  • [AI绘画]sd学习记录(二)文生图参数进阶
  • Rapidio门铃消息FIFO溢出机制
  • TongWeb7.0动态密钥说明