Подтвердить что ты не робот

Spring AOP AfterTrowing против совета

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

Единственный совет, который также поймал бы рассматриваемое исключение, был бы 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());
  }
}

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

4b9b3361

Ответ 1

Spring ссылка doc говорит:

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

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