एक पहलू को लागू करने का प्रयास करते समय, यह किसी निश्चित प्रकार की त्रुटि को पकड़ने और लॉगिंग करने के लिए ज़िम्मेदार है, मैंने शुरू में सोचा था कि यह आफ्टर थ्रोइंग सलाह का उपयोग करना संभव होगा। हालांकि ऐसा लगता है कि उनकी सलाह अपवाद नहीं पकड़ती है, लेकिन अपवाद के साथ कुछ करने के लिए केवल एक अतिरिक्त प्रविष्टि बिंदु प्रदान करता है।स्प्रिंग एओपी आफ्टर थ्रॉइंग बनाम सलाह के आसपास
एकमात्र सलाह जो प्रश्न में अपवाद भी पकड़ लेगी, उसके बाद एक एराडवाइस होगा - या तो मैंने या कुछ गलत किया था।
क्या कोई यह कह सकता है कि वास्तव में अगर मैं अपवाद पकड़ना चाहता हूं तो मुझे 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());
}
}
ध्यान दें कि इस उदाहरण में मैंने सभी अपवादों को पकड़ा, क्योंकि यह सिर्फ एक उदाहरण है। मैं सभी अपवादों को निगलने के लिए अपने बुरे अभ्यास को जानता हूं, लेकिन मेरे वर्तमान उपयोग के मामले में, मैं डुप्लिकेट लॉगिंग तर्क से बचते समय एक विशेष प्रकार का अपवाद सिर्फ लॉग इन करना चाहता हूं।
आप वास्तव में सलाह के चारों ओर और इस तरह के एक ही बिंदु पर सलाह फेंकने के बाद दोनों का उपयोग नहीं करेंगे। सलाह के आसपास समग्र है और आपको निष्पादन को पूरी तरह से नियंत्रित करने की अनुमति देता है। चूंकि आपकी आसपास की सलाह से बाहर निकालने के लिए अपवाद संभव नहीं है (आपके द्वारा प्रयास किए गए प्रयास/पकड़ ब्लॉक के कारण जो अपवाद को फिर से नहीं फेंकता है), सलाह फेंकने के बाद कभी भी लागू नहीं किया जाएगा। –