【发布时间】:2020-12-16 13:20:12
【问题描述】:
UPD我已经更新了 Aspects 的代码以进一步抛出异常
我有 SpringBoot 应用程序、服务类,我需要为我的服务(不是 MVC)实现异常处理程序。任务是记录错误并将其进一步抛给客户端。
我决定将 Aspect 与 @AfterThrowing 建议一起使用。我将在AspectOne 方面捕获一些异常(扩展RuntimeException)。对于其他情况,我需要在 AspectTwo 方面捕获异常(扩展 RuntimeException)。
所以我做了以下代码:
public class MyOwnException extends RuntimeException {
}
@Aspect
@Order(0)
@Component
public class AspectOne {
@Pointcut("execution(* com.test.MyService.*(..))")
public void logException() {}
@AfterThrowing(pointcut="logException()", throwing="ex")
public void logException(MyOwnException ex) {
System.out.println("MyOwnException has been thrown: " + ex.getMessage());
throw ex;
}
}
@Aspect
@Order(1)
@Component
public class AspectTwo {
@Pointcut("execution(* com.test.MyService.*(..))")
public void logException() {}
@AfterThrowing(pointcut="logException()", throwing="ex")
public void logException(RuntimeException ex) {
System.out.println("Some unknown exception has been thrown: " + ex);
throw ex;
}
}
问题是AspectTwo 在MyOwnException 和RuntimeException 的其他祖先的两种情况下都被执行。如何限制AspectTwo 仅在AspectOne 未捕获异常时执行?
似乎@Order 注释不像我预期的那样工作。
【问题讨论】:
-
订单完全符合预期。它首先执行 AspectOne,然后执行 AspectTwo。它不会限制执行,因为某些东西已经运行。在第二方面实现逻辑以忽略其他方面处理的错误。
-
您的意思是在AspectTwo 中使用instanceof 来忽略它吗?我希望使用更通用的东西,比如说这个异常来自第一个方面”。否则每个新的异常我都应该添加到两个方面
-
或者编写一个以某种方式处理众所周知的异常的单个方面,并且以不同的方式处理其他方式,您也不需要重新编写异常 AFAIK,它无论如何都会传播。
标签: spring exception aop exceptionhandler