首页 > 编程语言 >AOP切面编程实现异常捕获——try-catch的更优解?

AOP切面编程实现异常捕获——try-catch的更优解?

时间:2023-11-28 21:45:06浏览次数:58  
标签:try aspectException 切面 AOP catch 异常

AOP(面向切面编程)是一种编程范式,它的目的是通过将横切关注点(如日志记录、事务管理、异常处理等)从主要业务逻辑中分离出来,以提高代码的模块化和可维护性。在异常处理方面,有人认为使用AOP来实现异常捕获能够提供更优雅的解决方案,相比于传统的try-catch块。

以下是一些可能的优势和注意事项:

优势:

  1. 分离关注点: AOP允许将异常处理逻辑从主要业务逻辑中分离出来,使代码更加模块化,提高可读性和可维护性。

  2. 避免样板代码: 使用AOP可以避免在每个可能抛出异常的地方都重复编写相同的try-catch块,减少了代码冗余。

  3. 集中管理: AOP允许在一个地方集中管理异常处理逻辑,使得对异常的处理更加一致,容易修改和扩展。

注意事项:

  1. 可读性: 对于简单的异常处理逻辑,使用try-catch块可能更加直观和易于理解。AOP的使用可能使代码变得更加抽象,降低了代码的可读性。

  2. 学习曲线: AOP本身可能对一些开发者来说是一个新的概念,需要一定的学习曲线。在项目中广泛使用AOP可能需要团队成员对AOP有一定的了解。

  3. 运行时性能: AOP通常会在运行时织入切面,可能对性能产生一些影响。在性能敏感的应用中,需要谨慎考虑AOP的使用。

  4. 调试和测试: AOP可能会增加调试和测试的复杂性,因为异常处理逻辑被分离到了不同的地方。确保测试覆盖所有可能的路径是很重要的。

综合考虑,选择使用AOP还是传统的try-catch块取决于具体的场景和项目需求。在一些大型项目或需要强调模块化和可维护性的情况下,使用AOP可能是一个不错的选择。然而,在小型项目或者简单的异常处理场景中,使用传统的try-catch块可能更为合适。

以下为代码示例

在TestService中添加方法

    public void aspectException(){
        throw new RuntimeException("welcome to aspectException");
    }

在切面类中添加切入点

@Component
@Aspect
@Slf4j
public class CustomAspect {
    
    /**
     * 通常情况下,全局异常处理器(如 @RestControllerAdvice)在异常发生时首先被触发。
     * 切面中的异常处理逻辑会在全局异常处理器之后执行。
     * 因为全局异常处理器可以拦截所有控制器中抛出的异常,而切面通常是特定切点上的处理逻辑。
     */
    @AfterThrowing(pointcut = "execution(* org.ashe.xxx.TestService.aspectException())", throwing = "exception") // 指定捕获aspectException()方法抛出的异常
    public void handleTestServiceException(Exception exception) {
        // 在这里处理捕获到的异常
        log.error("Exception caught in aspect: " + exception.getMessage());
    }
    
}

@AfterThrowing(pointcut = "execution(* org.ashe.xxx.TestService.aspectException())", throwing = "exception") 

你可以选择修改pointcut 切入点来限定你的异常范围(包/类/方法)

标签:try,aspectException,切面,AOP,catch,异常
From: https://www.cnblogs.com/ashet/p/17829741.html

相关文章

  • maven构建【invalid entry size】
    maven构建异常【invalidentrysize】项目背景java项目存在多个模块,其中一个模块需要先构建成一个jar包,然后在被另一个模块依赖构建成新的jar包使用的maven插件:maven-assembly-plugin:2.2:singlejdk版本:1.8编译问题现场:第一个模块的jar构建成功,第二个模块刚刚开始就出现异......
  • Caddy设置try_files导致handle配置失效
    问题在Caddy中,请求路径默认会在Caddy的路径中查找。然而,如果是Vue项目,URI通常会是路由,如果此时刷新页面就可能导致页面出错。因此,我们可以使用try_files来在页面找不到时重定向到index.html。try_files{path}/index.html;然而,加入这种配置会导致handle的监听路径冲突,从......
  • odigos 基于ebpf 以及OpenTelemetry 的分布式tracing 解决方案
    按照odigos官方的介绍是不需要进行代码的修改就可以实现方便的跨应用的分布式trace,目前支持java,python,net,go,js等语言目前看官方的介绍,安装是比较简单的(核心基于了k8s),目前官方文档比较清晰可以试用下说明目前开源分布式trace的工具是越来越多了,同时基于ebpf以及OpenTelemetry标......
  • try···finally执行
    代码publicstaticvoidmain(String[]args){System.out.println(test());}publicstaticinttest(){inta=1;try{returna;}finally{++a;}}打印结果print输出还是1......
  • 什么是 Public NPM Registry
    PublicNPMRegistry是一个巨大的代码库,它是Node.js开发者们的重要资源。在这个库中,开发者们可以分享、发现、下载和使用数以万计的开发项目所需的代码包。这些代码包被称为"packages",每一个package都是一个完整的、可以独立运行的代码模块,它包含了所有必要的元数据信息,如其......
  • General error: 1205 Lock wait timeout exceeded; try restarting transaction【事务
    转载:https://blog.51cto.com/u_12390904/6254246       ......
  • Java中使用try-with-resources
    Java7中引入的对资源 try-with-resources ,声明在 try 块中使用的资源,并保证资源将在该块执行后关闭。声明的资源需要实现自动关闭接口。 1.使用资源try典型的try-catch-finally块:Scannerscanner=null;try{scanner=newScanner(newFile("test.txt"));......
  • 无涯教程-Tk - Entry部件函数
    输入窗口小部件用于接受一行文本作为输入。在所有Tk应用程序中,几乎都必须获得用户输入。条目小部件的语法如下所示-entryentryNameoptionsEntry-参数下表中列出了条目小部件可用的选项-Sr.No.Syntax&Remark1-backgroundcolor用于设置小部件的背景颜色。2-bo......
  • 如何解决mim install mmengine/mmcv 时一直waring retry
    miminstallmmengineWARNING:Retrying(Retry(total=4WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby'ConnectTimeoutError(<pip._vendor.urllib3.connection.HTTPSConnectionobjectat......
  • try catch 块 在catch块或者try块 return 掉 finally会执行吗?
    1.在catch块return掉finally会执行吗?答案:会代码:点击查看代码try{ints=1;Console.WriteLine(1);vara=5/(1-s);//除以0捕获异常}catch(Exception){Console.WriteLine(2);return;}finally{Console.WriteLine(3);}Co......