Spring AOP AfterThrowing vs. Around Advice - PullRequest
20 голосов
/ 23 марта 2010

при попытке реализовать Aspect, который отвечает за перехват и регистрацию ошибок определенного типа, я изначально думал, что это возможно, используя совет AfterThrowing. Однако, похоже, что его совет не ловит исключение, а просто предоставляет дополнительную точку входа, чтобы сделать что-то с исключением.

Единственным советом, который также поймает рассматриваемое исключение, будет AroundAdvice - либо я, либо я сделал что-то не так.

Кто-нибудь может утверждать, что действительно, если я хочу поймать исключение, я должен использовать AroundAdvice? Я использовал следующую конфигурацию:

@Pointcut("execution(* test.simple.OtherService.print*(..))")
public void printOperation() {}

@AfterThrowing(pointcut="printOperation()", throwing="exception")
public void logException(Throwable exception) {
  System.out.println(exception.getMessage());
}

@Around("printOperation()")
public void swallowException(ProceedingJoinPoint pjp) throws Throwable {
  try {
    pjp.proceed();
  } catch (Throwable exception) {
    System.out.println(exception.getMessage());
  }
}

Обратите внимание, что в этом примере я поймал все исключения, потому что это просто пример. Я знаю, что это плохая практика - просто проглотить все исключения, но для моего текущего варианта использования я хочу, чтобы один особый тип исключения просто регистрировался, избегая дублирования логики ведения журнала.

1 Ответ

19 голосов
/ 24 марта 2010

Ссылка Spring документ гласит:

"После броска совет запускается, когда выполнение соответствующего метода завершается выбрасывая исключение "

К тому времени уже слишком поздно перехватывать исключение, поскольку оно уже было сгенерировано и метод завершен. Подход, который вы использовали с рекомендацией @Around, является единственным способом на самом деле поймать исключение и обработать его до выхода из метода.

...