AOP异常处理

IAm*_*aja 20 java aop exception-handling

我看到Guice和Spring使用AOP联盟进行方法拦截,我一直在试图弄清楚如何让AOP联盟拦截和处理某些异常,所以我不必继续编写相同的代码.在每个catch街区内再次出现.

但是在审查了游戏之后,它看起来并不像AOP联盟提供任何方式来拦截抛出的Throwables,使得处理程序/拦截器可以执行某些操作(记录异常等),然后确定是否传播任何进一步的例外或者只是恢复到引发异常的行之后的下一行:

HerpDerp hd = null;

if(hd == null)
    throw new RuntimeException("Herpyl derp!");

Manny.pacquiao();
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种AOP异常处理机制,它将拦截RuntimeException并使用业务逻辑来决定是继续传播它还是在Manny.pacquioa()通话时恢复.

  • 如果在Java中无法做到这一点,请告诉我
  • 无论是否可以在Java中执行此操作,是否有办法拦截抛出异常与AOP联盟或我必须去其他地方.如果我必须去别的地方,在哪里?AspectJ的?

谢谢!

Eri*_* B. 35

您可以使用Spring AOP捕获异常,但我不知道它是否符合您对纯Java框架的要求.

使用Spring,您可以编写一个简单的AOP拦截器,如:

@Aspect
public class ErrorInterceptor{
@AfterThrowing(pointcut = "execution(* com.mycompany.package..* (..))", throwing = "ex")
public void errorInterceptor(WidgetException ex) {
    if (logger.isDebugEnabled()) {
        logger.debug("Error Message Interceptor started");
    }

    // DO SOMETHING HERE WITH EX
    logger.debug( ex.getCause().getMessage());


    if (logger.isDebugEnabled()) {
        logger.debug("Error Message Interceptor finished.");
    }
}
}
Run Code Online (Sandbox Code Playgroud)

但是没有办法返回到调用方法或继续处理后续行.但是,如果你在这里处理异常,除非你自己重新抛出它,否则它不会起泡链.