我正在尝试捕获在我的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()
的情况下捕获此异常?
答案 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() returning
,after() throwing
和after()
建议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
建议一样在这种情况下不会运行。