2010-03-23 13 views
19

एक पहलू को लागू करने का प्रयास करते समय, यह किसी निश्चित प्रकार की त्रुटि को पकड़ने और लॉगिंग करने के लिए ज़िम्मेदार है, मैंने शुरू में सोचा था कि यह आफ्टर थ्रोइंग सलाह का उपयोग करना संभव होगा। हालांकि ऐसा लगता है कि उनकी सलाह अपवाद नहीं पकड़ती है, लेकिन अपवाद के साथ कुछ करने के लिए केवल एक अतिरिक्त प्रविष्टि बिंदु प्रदान करता है।स्प्रिंग एओपी आफ्टर थ्रॉइंग बनाम सलाह के आसपास

एकमात्र सलाह जो प्रश्न में अपवाद भी पकड़ लेगी, उसके बाद एक एराडवाइस होगा - या तो मैंने या कुछ गलत किया था।

क्या कोई यह कह सकता है कि वास्तव में अगर मैं अपवाद पकड़ना चाहता हूं तो मुझे 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

आप वास्तव में सलाह के चारों ओर और इस तरह के एक ही बिंदु पर सलाह फेंकने के बाद दोनों का उपयोग नहीं करेंगे। सलाह के आसपास समग्र है और आपको निष्पादन को पूरी तरह से नियंत्रित करने की अनुमति देता है। चूंकि आपकी आसपास की सलाह से बाहर निकालने के लिए अपवाद संभव नहीं है (आपके द्वारा प्रयास किए गए प्रयास/पकड़ ब्लॉक के कारण जो अपवाद को फिर से नहीं फेंकता है), सलाह फेंकने के बाद कभी भी लागू नहीं किया जाएगा। –

उत्तर

18

Spring reference दस्तावेज़ का कहना है:

तो यह बहुत देर हो चुकी तक यह के रूप में अपवाद को पकड़ने के लिए " से सलाह रन फेंक जब एक मिलान किया विधि निष्पादन बाहर निकलता है एक अपवाद फेंकने के बाद" पहले ही फेंक दिया गया है और विधि निकल गई है। @Around सलाह के साथ आपके द्वारा लिया गया दृष्टिकोण वास्तव में अपवाद को पकड़ने और विधि से बाहर निकलने से पहले इसका निपटारा करने का एकमात्र तरीका है।

+0

मुझे वास्तव में यह नहीं लगता कि यह सच है। मेरा मानना ​​है कि हैंडलर प्वाइंट प्वाइंट अपवाद को पकड़ने का तरीका है और विधि से बाहर निकलने से पहले इसका सामना करना है। सलाह के आसपास अपवाद को फेंकने और वापस लौटने के बाद अपवाद को पकड़ने की अनुमति मिलेगी। कृपया देखें http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

मुझे पता है कि यह 4 साल बाद है, लेकिन यह प्रश्न अभी Google खोज पर आया है। @ टिमहेनेकी, शेन सही है। सलाह फेंकने के बाद अपवाद को फेंकने से नहीं रोका जा सकता है (कम से कम वसंत एओपी के साथ नहीं)। मुझे पता है क्योंकि मैंने अभी कोशिश की है (वसंत-एओपी 3.2.9 के साथ)। यदि आप अपवाद को पकड़ना चाहते हैं, तो वह तब होता है जब आप सलाह के आसपास उपयोग करेंगे, क्योंकि इससे आपको निष्पादन का पूरा नियंत्रण मिल जाएगा। –

संबंधित मुद्दे