Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Aspectj“;“扔”之后监视特定的异常_Java_Aspectj_Pointcut - Fatal编程技术网

Java Aspectj“;“扔”之后监视特定的异常

Java Aspectj“;“扔”之后监视特定的异常,java,aspectj,pointcut,Java,Aspectj,Pointcut,我试图捕获通过aspectj从应用程序代码抛出的所有异常 有很多地方可以抛出此异常。 一旦抛出异常,我想记录它或执行一些操作(不管它是否稍后被捕获) 我试过使用: @AfterThrowing(value = "(execution(* *.*(..))), throwing = "throwable") 但这是一种过激的行为,因为它捕获了所有的异常。我可以稍后手动筛选,但我正试图避免这种情况(由于我的应用程序的性质,在某些情况下由于类加载器问题导致加载时间问题) 我也试过: @AfterTh

我试图捕获通过aspectj从应用程序代码抛出的所有异常

有很多地方可以抛出此异常。 一旦抛出异常,我想记录它或执行一些操作(不管它是否稍后被捕获)

我试过使用:

@AfterThrowing(value = "(execution(* *.*(..))), throwing = "throwable")
但这是一种过激的行为,因为它捕获了所有的异常。我可以稍后手动筛选,但我正试图避免这种情况(由于我的应用程序的性质,在某些情况下由于类加载器问题导致加载时间问题)

我也试过:

@AfterThrowing(value = "(execution(* *.*(..))) throws MySpecificException, throwing = "throwable")
但是它是不够的,因为如果该方法声明它抛出了很多异常呢

关于如何只捕获相关异常而不在切入点实现中过滤它们,有什么建议吗


谢谢

您的代码不可执行,请下次提供一个或至少一个完整的方面。你甚至没有提供建议的签名。这不是一个很好的提问方式。作为拥有1000+信誉点的用户,您应该知道这一点

无论如何,你的问题的答案其实很简单。假设您有以下示例代码:

异常类+驱动程序应用程序:

package de.scrum\u master.app;
公共类MySpecificeException扩展了异常{
私有静态最终长serialVersionUID=1L;
}
package de.scrum\u master.app;
导入java.io.IOException;
公共类应用程序{
公共字符串doSomething(整数){
返回编号.toString();
}
public void doSomethingElse(boolean doThrow)抛出myspecificeexception{
if(doThrow)
抛出新的mySpecificeException();
}
public void doWhatever(布尔doThrow)抛出myspecificeexception、IOException{
if(doThrow)
抛出新的mySpecificeException();
其他的
抛出新IOException();
}
publicstaticvoidmain(字符串[]args)抛出myspecificeexception、IOException{
应用程序=新应用程序();
//只是为了不弄乱IDE中的控制台输出
系统设置错误(系统输出);
//这里没有例外
应用:剂量测定法(11);
应用:doSomethingElse(假);
//让我们抓住一些例外
试一试{
应用:doSomethingElse(真);
}捕获(MySpecificationException e){
系统输出打印项次(“捕获”+e);
}
试一试{
应用程序。doWhatever(真);
}捕获(MySpecificationException e){
系统输出打印项次(“捕获”+e);
}
试一试{
申请。doWhatever(假);
}捕获(IOE异常){
系统输出打印项次(“捕获”+e);
}
//不要抓住这个
应用:doSomethingElse(真);
}
}
不带方面的控制台日志:

捕获de.scrum\u master.app.mySpecificationException
捕获de.scrum_master.app.mySpecificationException
捕获的java.io.IOException
线程“main”de.scrum_master.app.mySpecificationException中出现异常
在de.scrum_master.app.Application.doSomethingElse(Application.java:12)
位于de.scrum_master.app.Application.main(Application.java:50)
这一点也不奇怪。我们捕获了不同类型的异常和未捕获的异常。现在,我们希望有一个方面专门记录所有出现的
MySpecificException
,不管它们是否被捕获

方面:

package de.scrum\u master.aspect;
导入org.aspectj.lang.JoinPoint;
导入org.aspectj.lang.annotation.afterhrowing;
导入org.aspectj.lang.annotation.Aspect;
导入de.scrum_master.app.myspecificeException;
@面貌
公共类例外记录{
@后throwing(value=“(execution(**.*(…))”,throwing=“mySpecificException”)
public void logException(JoinPoint thisJoinPoint,myspecificeexception myspecificeexception){
System.out.println(thisJoinPoint+“->”+myspecificeException);
}
}
是否查看advice方法的签名?只需将异常参数限制为所需的类型

带有方面的控制台日志:

执行(void de.scrum_master.app.Application.doSomethingElse(布尔值))->de.scrum_master.app.myspecificeexception
捕获de.scrum_master.app.mySpecificationException
执行(void de.scrum_master.app.Application.doWhatever(布尔值))->de.scrum_master.app.myspecificeexception
捕获de.scrum_master.app.mySpecificationException
捕获的java.io.IOException
执行(void de.scrum_master.app.Application.doSomethingElse(布尔值))->de.scrum_master.app.myspecificeException
执行(void de.scrum_master.app.Application.main(String[])->de.scrum_master.app.myspecificeexception
线程“main”de.scrum_master.app.mySpecificationException中出现异常
在de.scrum_master.app.Application.doSomethingElse(Application.java:12)
位于de.scrum_master.app.Application.main(Application.java:50)

您的代码不可执行,请下次提供一个或至少一个完整的方面。你甚至没有提供建议的签名。这不是一个很好的提问方式。作为拥有1000+信誉点的用户,您应该知道这一点

无论如何,你的问题的答案其实很简单。假设您有以下示例代码:

异常类+驱动程序应用程序:

package de.scrum\u master.app;
公共类MySpecificeException扩展了异常{
私有静态最终长serialVersionUID=1L;
}
package de.scrum\u master.app;
导入java.io.IOException;
公共类应用程序{
公共字符串doSomething(整数){
返回编号.toString();
}
public void doSomethingElse(boolean doThrow)抛出myspecificeexception{
if(doThrow)
抛出新的mySpecificeException();
}
public void doWhatever(布尔doThrow)抛出myspecificeexception、IOException{
if(doThrow)
抛出新的mySpecificeException();
其他的
抛出新IOException();
}
公共静态真空干管