2012-06-08 18 views
16

मुझे लगता है कि गुइस और स्प्रिंग विधि इंटरसेप्शन के लिए हुड के तहत एओपी गठबंधन का उपयोग करते हैं, और मैं यह समझने की कोशिश कर रहा हूं कि एओपी गठबंधन को कुछ अपवादों को रोकने और संभालने के लिए कैसे प्राप्त किया जाए, इसलिए मुझे रखने की ज़रूरत नहीं है प्रत्येक catch ब्लॉक के अंदर एक ही कोड को बार-बार लिखना।एओपी अपवाद हैंडलिंग

लेकिन खेलने समीक्षा करने के बाद, ऐसा लगता है AOP गठबंधन को इस तरह से फेंक दिया Throwable रों रोकना है कि हैंडलर/इंटरसेप्टर कुछ कर सकते हैं किसी भी तरह से प्रदान करता है नहीं लगता है (अपवाद, आदि लॉग इन करें) और फिर निर्धारित किया जाए या नहीं अपवाद किसी भी आगे प्रचार करने के लिए या सिर्फ वापस अगली पंक्ति में लाइन जो अपवाद फेंक दिया निम्नलिखित ठीक करने के लिए:

HerpDerp hd = null; 

if(hd == null) 
    throw new RuntimeException("Herpyl derp!"); 

Manny.pacquiao(); 

मैं एक AOP अपवाद संचालन तंत्र कि RuntimeException रोकना होगा की तलाश में हूँ और यह तय करने के लिए व्यवसाय तर्क का उपयोग करें कि इसे प्रचारित करना है या Manny.pacquioa() कॉल पर वापस पुनर्प्राप्त करना है या नहीं ।

  • यदि यह जावा में यह करने के लिए संभव नहीं है, मुझे पता है
  • की परवाह किए बिना या नहीं, इसकी जावा में ऐसा करना संभव, AOP एलायंस या के साथ फेंक दिया अपवाद अवरोधन के लिए एक रास्ता है तो कृपया क्या मुझे कहीं और जाना है। और अगर मुझे कहीं और जाना है, तो कहाँ? AspectJ?

धन्यवाद!

उत्तर

30

आप स्प्रिंग एओपी के साथ अपवाद पकड़ सकते हैं, लेकिन मुझे नहीं पता कि यह शुद्ध जावा ढांचे के लिए आपकी आवश्यकता से मेल खाता है या नहीं।

स्प्रिंग के साथ, आप की तरह कुछ के रूप में एक सरल AOP इंटरसेप्टर लिख सकते हैं:

@Aspect 
public class ErrorInterceptor{ 
@AfterThrowing(pointcut = "execution(* com.mycompany.package..* (..))", throwing = "ex") 
public void errorInterceptor(WidgetException ex) { 
    if (logger.isDebugEnabled()) { 
     logger.debug("Error Message Interceptor started"); 
    } 

    // DO SOMETHING HERE WITH EX 
    logger.debug(ex.getCause().getMessage()); 


    if (logger.isDebugEnabled()) { 
     logger.debug("Error Message Interceptor finished."); 
    } 
} 
} 

लेकिन वहाँ बुला विधि पर लौटने या बाद लाइन पर प्रसंस्करण जारी रखने के लिए कोई रास्ता नहीं है। हालांकि यदि आप यहां अपवाद को संभालते हैं, तो यह श्रृंखला को तब तक बुलबुला नहीं करेगा जब तक कि आप इसे स्वयं को पुनर्स्थापित नहीं करते।

1

"पकड़" AspectJ साथ ध्यान में न आया अपवाद हैं, तो आपको निम्न पहलू का उपयोग कर सकते करने के लिए:

pointcut uncaughtExceptionScope() : 
    (execution(* com.mycompany.myrootpackage..Main.main(..)) 
    || execution(* java.util.concurrent.Callable+.call()) 
    || execution(* java.lang.Runnable+.run()) 
    )); 

after() throwing(Throwable t) : uncaughtExceptionScope() && !cflow(adviceexecution()) { 
    handleException(thisJoinPoint, t); 
} 

protected void handleException(JoinPoint jp, Throwable t) 
{ 
    // handle exception here 
} 

मुझे नहीं लगता कि यह निष्पादन बात करने के लिए "वापस जाएं 'करने के लिए संभव है।

+0

धन्यवाद @Wim पकड़ने - AOP आधारित है अपवाद हैंडलिंग एओपी गठबंधन के साथ ऐसा संभव नहीं है? – IAmYourFaja

+0

मुझे ऐसा नहीं लगता है। यदि आप [वसंत दस्तावेज़] (http://static.springsource.org/spring/docs/3.1.1.RELEASE/spring-framework-reference/html/aop.html) की जांच करते हैं, तो यह यह दिखाता है: 'बिंदु बिंदु : किसी प्रोग्राम के निष्पादन के दौरान एक बिंदु, जैसे किसी विधि का निष्पादन या अपवाद का संचालन। स्प्रिंग एओपी में, एक जॉइन पॉइंट हमेशा एक विधि निष्पादन का प्रतिनिधित्व करता है। –

+0

[कन्स्ट्रक्टर इंटरसेप्टर] (http://aopalliance.sourceforge.net/doc/org/aopalliance/intercept/ConstructorInterceptor.html) किसी भी तरह अपवादों को अवरुद्ध करने के लिए हैक-अप किया जा सकता है (जैसा कि उनका निर्माण किया गया है)? – IAmYourFaja

3

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

HerpDerp hd = null; 

try { 
    if(hd == null) 
     throw new RuntimeException("Herpyl derp!"); 
} catch(RuntimeException e) { 
    if (someConditionIsMet) { 
     throw e; 
    } 
} 

Manny.pacquiao(); 
1

@ 4herpsand7derpsago यदि आप ऐसा करने के लिए कोशिश कर रहे हैं AOP का उपयोग कर इसे संभाल करने के लिए विभिन्न कार्य करने के लिए फेंक दिया अपवाद को पकड़ने के लिए है और फिर कोड जहां अपवाद मूल रूप से फेंक दिया करने के लिए वापस आता है, मुझे लगता है कि आप समझते हैं कि याद आती है एओपी की अवधारणा।

आप अपने कोड

HerpDerp hd = null; 

if(hd == null) 
throw new RuntimeException("Herpyl derp!"); 

Manny.pacquiao(); 

में बाहर बिंदु के रूप में आप AOP अपने RuntimeException को पकड़ने के लिए, इसे संभाल करने के लिए कुछ सामान कैसा प्रदर्शन करते हैं और Manny.pacquiao(); में वापस आता है, तो इसका जवाब आप नहीं कर सकते है। कारण यह है कि जब RuntimeException फेंक दिया जाता है और एओपी द्वारा पकड़ा जाता है, तो स्टैक पहले से ही आपके एओपी कोड पर है। आप Many.pacquiao(); निष्पादित करने के लिए वापस नहीं आ सकते हैं। एक ही तरीका है अगर आप Many.pacquiao(); क्रियान्वित जारी रखना चाहते हैं try-finally ब्लॉक का उपयोग करना है का पालन करें

HerpDerp hd = null; 

try { 
    if(hd == null) 
     throw new RuntimeException("Herpyl derp!"); 
} finally { 
    Manny.pacquiao(); 
} 

के रूप में उसके बाद ही अपने Many.pacquiao() निष्पादित हो जाएगा, लेकिन पहले अपने AOP RuntimeException

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