2010-03-23 3 views
19

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

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

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

@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()); 
    } 
} 

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

+0

Вы действительно не использовали бы оба совета и после того, как бросили совет на той же точке соединения, как это. Вокруг совет является целостным и позволяет полностью контролировать выполнение. Поскольку исключение может быть исключено из вашего совета (из-за того, что у вас есть блок try/catch, который не перебрасывает исключение), совет после броска никогда не будет применен. –

ответ

18

Spring reference дока говорит:

«После броска пробегов советов, когда соответствуют выходам исполнения метод, бросать исключение»

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

+0

Я действительно не думаю, что это правда. Я считаю, что точка соединения обработчика - это способ поймать исключение и разобраться с ним до выхода метода. Вокруг совета вы сможете поймать исключение после того, как метод выкинул исключение и вернулся. См. Http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

Я знаю, что это уже 4 года спустя, но этот вопрос просто появился в поиске Google. @TimHennekey, Шейн прав. После броска совет не может предотвратить исключение исключения (по крайней мере, не с Spring AOP). Я знаю, потому что я просто попробовал (с весенним отрывом 3.2.9). Если вы хотите поймать исключение, то есть когда вы будете использовать советы, потому что это даст вам полный контроль над исполнением. –

Смежные вопросы