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

时间:2016-03-08 23:24:10

标签: java exception aop aspectj aspect

我正在尝试捕获在我的Java类中的main中抛出的异常。

我的主要代码:

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

在我的方面,我创建了after() returning: execution(* main(*)) { advice}after() throwing(Exception e): execution(* main(*)) { advice },以确定是否在主要内容中抛出异常,以便在每个建议中执行不同的操作。

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

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

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

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

所以,据我所知,我没有抓住异常,我刚刚发现main发生了异常。

有没有办法可以在不使用around()的情况下捕获此异常?

1 个答案:

答案 0 :(得分:6)

您无法通过after() throwing建议来抑制异常,您需要使用around()建议,因为您怀疑。

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

after() throwing建议可以在您的某些兴趣点引发异常时运行其他代码,但它不会阻止异常传播,除非您抛出另一个异常来自您的建议代码(如果您这样做,请包装被抑制的异常):

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() returningafter() throwingafter()建议around() advice在对我的回答发表评论后跟进了一个问题。

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() returning部分的代码没有执行,因为您的主类没有正常完成,因为它会抛出异常,就像普通的after() returning建议一样在这种情况下不会运行。