但是如何捕获在其他上下文之外生成的异常呢?对于 例如生命周期回调或计划任务
一个解决方案,我能想到的它,是使用After Throwing Advice。基本的想法是定义一个可以捕获某些bean抛出的异常并适当处理它们的通知。
例如,你可以定义一个定制的注释,如:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Handled {}
,并使用标注来标记应建议的方法。然后,你可以注释你的,也就是说,这个注释工作:
@Component
public class SomeJob {
@Handled
@Scheduled(fixedRate = 5000)
public void doSomething() {
if (Math.random() < 0.5)
throw new RuntimeException();
System.out.println("I escaped!");
}
}
最后定义处理方法抛出的异常与@Handled
注释的建议:
@Aspect
@Component
public class ExceptionHandlerAspect {
@Pointcut("@annotation(com.so.Handled)")
public void handledMethods() {}
@AfterThrowing(pointcut = "handledMethods()", throwing = "ex")
public void handleTheException(Exception ex) {
// Do something useful
ex.printStackTrace();
}
}
在过去的方法执行更多更细粒度的控制,你也可以使用Around Advice。另外不要忘记启用自动代理功能,在Java配置中使用@EnableAspectJAutoProxy
或在XML配置中使用<aop:aspectj-autoproxy/>
。