2010-03-23 3 views
19

Aspect를 구현하려고 할 때 특정 유형의 오류를 포착하고 기록하는 경우 처음에는 AfterThrowing 조언을 사용하여 가능하다고 생각했습니다. 그러나 그의 충고가 예외를 잡아 내지는 못하지만, 예외로 무언가를하기위한 추가 진입 점을 제공합니다.Spring AOP AfterThrowing 대 Advice around

또한 문제의 예외를 잡을 수있는 유일한 조언은 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()); 
    } 
} 

이 예제에서는 모든 예외를 포착했습니다. 나는 모든 예외를 삼키기위한 나쁜 습관을 알고 있지만, 현재의 유스 케이스의 경우 중복 로깅 로직을 피하면서 방금 로깅되는 특별한 유형의 예외를 원한다.

+0

정말 주위의 조언과 같은 조인 포인트에 대한 조언을 던진 후에 사용하지 않을 것입니다. around advice는 전체 론적이며 실행을 완전히 제어 할 수 있습니다. 주위의 조언 (예외를 다시 던지지 않는 try/catch 블록 때문에)에서 예외가 throw 될 수 없으므로 이후의 조언은 적용되지 않습니다. –

답변

18

Spring reference 문서는 말한다 :

그것으로 예외를 잡기 위해 다음 너무 늦기까지

"는 이 방법은 실행 종료와 일치 할 때 예외를 던지는 조언 실행을 던지는 후" 이미 던져졌고 그 방법이 종료되었습니다. @Around advice로 얻은 접근법은 예외를 실제로 잡아 내고 메소드가 종료되기 전에 처리하는 유일한 방법입니다.

+0

사실 이것이 사실이라고 생각하지 않습니다. 나는 핸들러 조인 포인트가 메서드를 종료하기 전에 예외를 잡아서 처리하는 방법이라고 생각한다. around advice는 메소드가 예외를 던진 다음 리턴 한 후에 예외를 포착 할 수있게합니다. http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

을 참조하십시오. 4 년 후 알지만이 질문은 Google 검색에서 나온 것입니다. @TimHennekey, 쉐인 말이 맞습니다. 조언을 던지면 throw되는 예외를 막을 수 없습니다 (적어도 Spring AOP에서는 그렇지 않습니다). 방금 시도했기 때문에 알 수 있습니다 (스프링 밥 3.2.9). 예외를 잡아 내고 싶다면 주위의 조언을 사용할 것입니다. 실행에 대한 완전한 제어권을 줄 수 있기 때문입니다. –