Spring AOP(三)之AfterThrowing增强处理 异常通知,拦截异常,处理异常,继续向外传播和catch 不同

使用@AfterThrowing注解可以修饰AfterThrowing增强处理,AfterThrowing增强处理主要用于处理程序中未处理的异常。使用@AfterThrowing注解时可指定如下的常用属性:

1)        pointcut/value:这两个属性的作用是一样的,它们都用于指定该切入点对应的切入表达式。一样既可是一个已有的切入点,也可以直接定义切入点表达式。当指定了pointcut属性后,value属性值将会被覆盖。

2)        throwing:该属性指定一个形参名,用于表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法抛出的异常。除此之外,在Advice方法中定义该参数时,指定的类型,会限制方法必须抛出指定类型的异常。

下面,我们定义于个AfterThrowing增强处理。


   
  1. @Aspect
  2. public class RepairAspect
  3. {
  4. // 匹配com.owenapp.service.impl包下所有类的、
  5. // 所有方法的执行作为切入点
  6. @AfterThrowing(throwing="ex"
  7. , pointcut="execution(* com.owen.app.service.impl.*.*(..))")
  8. // 声明ex时指定的类型会限制目标方法必须抛出指定类型的异常
  9. // 此处将ex的类型声明为Throwable,意味着对目标方法抛出的异常不加限制
  10. public void doRecoveryActions(Throwable ex)
  11. {
  12. System.out.println("目标方法中抛出的异常:" + ex);
  13. System.out.println("模拟Advice对异常的修复...");
  14. }
  15. }

正如上面所看到的,程序中使用@AfterThrowing注解时,指定了一个throwing属性,该属性值为ex,这允许在增强处理方法(doRecoveryActions()方法)中定义名为ex的形参,程序可通过该形参访问目标方法所抛出的异常。下面我们定义一个HelloImpl.java。


   
  1. @Component("hello")
  2. public class HelloImpl implements Hello
  3. {
  4. // 定义一个简单方法,模拟应用中的业务逻辑方法
  5. public void foo()
  6. {
  7. System.out.println("执行Hello组件的foo()方法");
  8. }
  9. // 定义一个addUser()方法,模拟应用中的添加用户的方法
  10. public int addUser(String name , String pass)
  11. {
  12. System.out.println("执行Hello组件的addUser添加用户:" + name);
  13. if(name.length() < 3 || name.length() > 10)
  14. {
  15. throw new IllegalArgumentException("name参数的长度必须大于3,小于10!");
  16. }
  17. return 20;
  18. }
  19. }

写个测试类:


   
  1. public class BeanTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. // 创建Spring容器
  6. ApplicationContext ctx = new
  7. ClassPathXmlApplicationContext("beans.xml");
  8. Hello hello = ctx.getBean("hello" , Hello.class);
  9. hello.foo();
  10. hello.addUser("owen" , "7788");
  11. }
  12. }

执行结果:

[java] 信息:Loading XML bean definitions from class path resource[java]执行Hello组件的foo()方法
[java]执行Hello组件的addUser添加用户:owen
[java]目标方法中抛出的异常:java.lang.IllegalArgumentArgumentException:name参数的长度必须大于3,小于10[java]Exception in threadmainjava.lang.IllegalArgumentException:name参数的长度必须大于3,小于10!
…….

总结:

  AOP的AfterThrowing处理虽然可以对目标方法的异常进行处理,但这种处理与直接使用catch捕捉不同,catch捕捉意味着完全处理该异常,如果catch块中没有重新抛出新的异常,则该方法可能正常结束;而AfterThrowing处理虽然处理了该异常,但它不能完全处理异常,该异常依然会传播到上一级调用者,即JVM。

https://blog.csdn.net/owen_william/article/details/50812780

原文地址:http://www.cnblogs.com/sunny3158/p/16831096.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性