AOP(三)之AfterThrowing增强处理
@AfterThrowing
使用@AfterThrowing注解可以修饰AfterThrowing增强处理,AfterThrowing增强处理主要用于处理程序中未处理的异常。使用@AfterThrowing注解时可指定如下的常用属性:
- pointcut/value:这两个属性的作用是一样的,它们都用于指定该切入点对应的切入表达式。一样既可是一个已有的切入点,也可以直接定义切入点表达式。当指定了pointcut属性后,value属性值将会被覆盖。
- throwing:该属性指定一个形参名,用于表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法抛出的异常。除此之外,在Advice方法中定义该参数时,指定的类型,会限制方法必须抛出指定类型的异常。
- argNames:
测试
实现类方法
@Override
public void testAfterThrowing() {
System.out.println("testAfterThrowing执行了!!!");
throw new RuntimeException("测试异常");
}
切面增强方法
//配置切入点
@Pointcut(value = "execution(* com.example.aopdemo.iservice.ISysLogService.testAfterThrowing(..))")
public void pointCutOfTestAfterThrowing(){};
//value与pointcut参数等效,指明切点,也可直接使用切入表达式
@AfterThrowing(pointcut = "pointCutOfTestAfterThrowing()")
public void logTestAfterThrowing1(){
System.out.println("测试AfterThrowing----");
}
// 声明ex时指定的类型会限制目标方法必须抛出指定类型的异常
// 此处将ex的类型声明为Throwable,意味着对目标方法抛出的异常不加限制
@AfterThrowing(pointcut = "pointCutOfTestAfterThrowing()",throwing = "ex")
public void logTestAfterThrowing(RuntimeException ex){
System.out.println("测试AfterThrowing----ex.msg1:"+ex.getMessage());
}
@AfterThrowing(pointcut = "pointCutOfTestAfterThrowing()",throwing = "ex")
public void logTestAfterThrowing2(NullPointerException ex){
System.out.println("测试AfterThrowing----ex.msg2:"+ex.getMessage());
}
@AfterThrowing(pointcut = "pointCutOfTestAfterThrowing()",throwing = "ex")
public void logTestAfterThrowing3(Exception ex){
System.out.println("测试AfterThrowing----ex.msg3:"+ex.getMessage());
}
测试结果
testAfterThrowing执行了!!!
测试AfterThrowing----ex.msg1:测试异常
测试AfterThrowing----
测试AfterThrowing----ex.msg3:测试异常
2019-11-30 23:19:02.888 ERROR 24520 --- [nio-8800-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: 测试异常] with root cause
AOP的AfterThrowing处理虽然可以对目标方法的异常进行处理,但这种处理与直接使用catch捕捉不同,catch捕捉意味着完全处理该异常,如果catch块中没有重新抛出新的异常,则该方法可能正常结束;
而AfterThrowing处理虽然处理了该异常,但它不能完全处理异常,该异常依然会传播到上一级调用者,即JVM,该方法不能正常结束。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~