2010-03-23 26 views
19

khi cố gắng thực hiện một Aspect, chịu trách nhiệm bắt và ghi lại một loại lỗi nhất định, ban đầu tôi nghĩ điều này có thể thực hiện được bằng cách sử dụng lời khuyên sau khi thực hiện. Tuy nhiên có vẻ như lời khuyên của anh ta không bắt được ngoại lệ, nhưng chỉ cung cấp một điểm vào bổ sung để làm điều gì đó với ngoại lệ.Spring AOP AfterThrowing vs. Around Advice

Lời khuyên duy nhất cũng sẽ bắt ngoại lệ trong câu hỏi sau đó sẽ là một AroundAdvice - hoặc là điều đó hoặc tôi đã làm điều gì đó sai trái.

Có ai có thể khẳng định rằng thực sự nếu tôi muốn bắt ngoại lệ, tôi phải sử dụng AroundAdvice? Cấu hình tôi đã sử dụng sau:

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

Lưu ý rằng trong ví dụ này, tôi đã phát hiện tất cả Ngoại lệ, vì nó chỉ là một ví dụ. Tôi biết thực hành xấu của nó chỉ nuốt tất cả các trường hợp ngoại lệ, nhưng đối với trường hợp sử dụng hiện tại của tôi, tôi muốn một loại ngoại lệ đặc biệt chỉ được ghi lại trong khi tránh logic ghi trùng lặp.

+0

Bạn thực sự sẽ không sử dụng cả hai lời khuyên và sau khi đưa ra lời khuyên trên cùng một điểm tham gia như thế này. Lời khuyên xung quanh là toàn diện và cho phép bạn hoàn toàn kiểm soát việc thực hiện. Vì không thể loại bỏ một ngoại lệ ra khỏi lời khuyên xung quanh của bạn (vì khối try/catch mà bạn không loại bỏ ngoại lệ), lời khuyên sau khi ném sẽ không bao giờ được áp dụng. –

Trả lời

18

Các Spring reference doc nói:

"Sau khi ném lời khuyên chạy khi một phù hợp lối ra phương pháp thực hiện bởi ném một ngoại lệ"

Đến lúc đó thì đã quá muộn để bắt ngoại lệ vì nó đã được ném và phương thức đã thoát. Cách tiếp cận bạn đã thực hiện với lời khuyên @Around là cách duy nhất để thực sự bắt ngoại lệ và xử lý nó trước khi thoát khỏi phương thức.

+0

Tôi thực sự không nghĩ điều này là đúng. Tôi tin rằng điểm xử lý tham gia là cách để nắm bắt ngoại lệ và đối phó với nó trước khi thoát khỏi phương thức. Lời khuyên xung quanh sẽ cho phép bạn nắm bắt ngoại lệ sau khi phương thức đã ném ngoại lệ và trả lại. Vui lòng xem http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

Tôi biết điều này là 4 năm sau đó, nhưng câu hỏi này chỉ xuất hiện trên tìm kiếm của Google. @TimHennekey, Shane là chính xác. Sau khi đưa ra lời khuyên không thể ngăn chặn ngoại lệ bị ném (ít nhất là không phải với Spring AOP). Tôi biết vì tôi vừa thử nó (với mùa xuân aop 3.2.9). Nếu bạn muốn bắt ngoại lệ, đó là khi bạn sẽ sử dụng xung quanh lời khuyên, bởi vì điều đó sẽ cho bạn toàn quyền kiểm soát việc thực thi. –

Các vấn đề liên quan