при попытке реализовать Аспект, который ответственен за ловлю и вход определенного типа ошибки, я первоначально думал, что это будет возможным использованием совета 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());
}
}
Обратите внимание, что в этом примере я поймал все Исключения, потому что это просто - пример. Я знаю, что его плохая практика просто глотает все исключения, но для моего текущего варианта использования я хочу, чтобы один специальный тип исключения был просто зарегистрирован при предотвращении логики входа дубликата.
В Spring ссылка документ говорит:
«После выдачи совета выполняется, когда выполнение соответствующего метода завершается через выброс исключения "
К тому времени уже слишком поздно перехватывать исключение, поскольку оно уже было сгенерировано и метод завершился. Подход, который вы использовали с советом @Around, - это единственный способ на самом деле поймать исключение и обработать его до выхода из метода.