ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 无法从main中捕获异常:after()throw(Exception e) – AspectJ

2019-05-28 00:48:07  阅读:343  来源: 互联网

标签:java exception aop aspectj aspect


我试图捕获在我的Java类中的main中抛出的异常.

我的主要代码:

public static void main(String[] args){
    new something();
    throw new RuntimeException();
}

在我的方面,我创建了after()返回:执行(* main(*)){advice}和after()throw(异常e):执行(* main(*)){advice}以查明是否为了在每个建议中做一些不同的事情,主要与否抛出异常.

请注意,在第二个内部,我使用以下命令在输出中打印e异常:

System.out.println("Threw an exception: " + e + "Joinpoint: " + thisJoinPoint.getSignature().toString());

问题是即使我在main中抛出一个异常,我可以从输出中看到匹配的切入点是第二个(输出:引发异常:java.lang.RuntimeExceptionJoinpoint:void main(String [])
),我的输出中仍然出现此错误:

Exception in thread "main" java.lang.RuntimeException
    at main(C.java:24)

所以,据我所知,我没有抓住异常,我刚刚发现在main中发生异常.

有没有办法,我可以捕获此异常,而不必使用around()?

解决方法:

您不能使用after()抛出建议来抑制异常,您需要使用您怀疑的around()建议.

void around(): execution(* MainClass.main(*)) {
    try {
        proceed();
    } catch (Exception e) {
        //suppress
        System.out.println("Suppressed an exception: " 
            + e + "Joinpoint: " + thisJoinPoint.getSignature().toString());
    }
}

当在你的某些兴趣点引发异常时,after()抛出建议可以运行额外的代码,但除非你从你的建议代码中抛出另一个异常,否则它不会阻止异常传播(包括被抑制的异常,如果你这样做):

after() throwing(Exception e): execution(* MainClass.main(*)) {
    System.out.println("Threw an exception: " + e + "Joinpoint: " 
        + thisJoinPoint.getSignature().toString());
    throw new RuntimeException("Another exception", e);
}

编辑:我正在添加一个示例,说明如何模仿before(),after()返回,after()throw和after()建议在around()建议中跟随我的答案评论中的问题.

void around(): execution(* MainClass.main(*)) {
    try {
        //before() code
        System.out.println("Before main started.");

        proceed();

        //after() returning code
        System.out.println("Main exited normally.");
    } catch (Exception e) {
        //after() throwing code suppressing exception unless you rethrow it
        System.out.println("Suppressed an exception: " + e + "Joinpoint: " 
            + thisJoinPoint.getSignature().toString());
    } finally {
        //after() code
        System.out.println("After main executed.");
    }
}

运行主类时,这将输出以下行:

Before main started.
Main started.
Suppressed an exception: java.lang.RuntimeException: errorJoinpoint: void MainClass.main(String[])
After main executed

请注意,after()返回部分的代码不会被执行,因为您的主类没有正常完成,因为它会抛出异常,就像正常的after()返回通知在这种情况下不会运行一样.

标签:java,exception,aop,aspectj,aspect
来源: https://codeday.me/bug/20190528/1167446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有