.net माइक्रोसॉफ्ट अपवाद हैंडलिंग ब्लॉक-क्या यह ओव्रेरिनेयरिंग के लिए एक आदर्श उदाहरण नहीं है?




exception-handling enterprise-library (5)

मैं इस समस्या में भाग लेता हूं जब मैं उन कार्यों को विकसित कर रहा हूं जो बिना वसूली योग्य स्थिति में नहीं हैं। मेरा मानना ​​है कि यह नीति चालित अपवाद प्रबंधन वास्तव में उपयोगी है और यह सुनिश्चित करता है कि इस परियोजना का हिस्सा अन्य सभी डेवलपर वास्तव में गैर पुनर्प्राप्त योग्य अपवादों के लिए एक मानक का पालन करते हैं।

मैं ऊपर पोस्टर्स से सहमत हूं, यदि आप नियंत्रण प्रवाह के लिए उनका उपयोग कर रहे हैं तो आप नीति आधारित अपवादों से दूर रहना चाह सकते हैं।

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

अपवाद हैंडलिंग एप्लीकेशन ब्लॉक का उद्देश्य है कॉन्फ़िग फाइलों को केंद्रीकृत और पूरी तरह कॉन्फ़िगर करने योग्य बनाने के लिए निम्न कुंजी अपवाद हैंडलिंग कार्य :

  • एक अपवाद लॉगिंग
  • एक अपवाद को बदलने
  • अपवाद लपेटना
  • अपवाद का प्रचार करना
  • आदि।

लाइब्रेरी इस प्रकार है कि आप अपने ब्लॉकों को पकड़ने की कोशिश करते हैं:

try
{
  // Run code.
}
catch(DataAccessException ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
    if (rethrow)
    {
        throw;
    }
}

पॉलिसी के नाम के लिए app.config में क्या निर्दिष्ट है ( डॉक्स के लिए यहां देखें ) के आधार पर, HandleException या तो होगा ...

  • एक पूरी तरह से नया अपवाद फेंक (मूल अपवाद की जगह)
  • एक नया एक में मूल अपवाद लपेटो और उस फेंक
  • अपवाद निगल (यानी कुछ भी नहीं)
  • क्या आपने मूल अपवाद को पुनः स्थापित किया है?

इसके अतिरिक्त आप इसे पहले से अधिक सामान करने के लिए कॉन्फ़िगर भी कर सकते हैं (उदाहरण के लिए अपवाद को लॉग करें)।

अब मेरी समस्या है: मुझे यह देखने में पूरी तरह असफल है कि यह कैसे कॉन्फ़िगर करने योग्य है कि अपवाद को प्रतिस्थापित किया गया है, लिपटे, निगल लिया गया है या पुनर्स्थापित किया जा सकता है। मेरे अनुभव में, यह निर्णय उस समय किया जाना चाहिए जब आप कोड लिखते हैं क्योंकि जब आप अपवाद प्रबंधन व्यवहार को बदलते हैं, तो आपको आम तौर पर आस-पास या कॉलिंग कोड को बदलना होगा।

उदाहरण के लिए, आपका कोड गलत तरीके से व्यवहार करना शुरू करेगा, जब आप फिर से कॉन्फ़िगर करेंगे कि किसी विशेष बिंदु पर फेंक दिया गया कोई विशेष अपवाद फिर से पुनर्स्थापित करने के बजाय निगल लिया जाता है (अपवर्जन होने पर कैच ब्लॉक के बाद कोड नहीं हो सकता है)। यह अपवाद से निपटने में अन्य सभी संभव बदलावों के लिए भी जाता है (जैसे -> पुनर्स्थापना, निगल -> लपेटें)

तो, मुझे नीचे की रेखा यह है कि अपवाद हैंडलिंग ब्लॉक उन समस्याओं को हल करता है जो वास्तव में व्यवहार में मौजूद नहीं हैं। अपवाद लॉगिंग और सूचना देना थोड़ा ठीक है, लेकिन क्या अन्य सभी चीजें सिर्फ ओव्रेरिनेयरिंग के लिए एक आदर्श उदाहरण नहीं हैं?


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

अब पॉलिसी के साथ हम किसी भी समय लॉन्ग करना शुरू कर सकते हैं बिना पूरे एप्लिकेशन में लॉगिंग लॉजिक को पुनरारंभ करने या बेवजह छिड़कने के लिए अब हम एप्लिकेशन ऑफ़लाइन न लेने के अपवाद और सभी की तरह देख सकते हैं।

स्मार्ट प्रोग्रामिंग अगर आप मुझसे पूछें ...


मेरी राय में, अपवाद हैंडलिंग ब्लॉक का उपयोग करने के एक वास्तविक मूल्य आपके कैच ब्लॉक में कोड की एक पंक्ति से शुरू होता है:

bool rethrow = ExceptionPolicy.HandleException (उदाहरण के लिए, "डेटा एक्सेस नीति");

कोड की एक पंक्ति - आप कितना आसान कर सकते हैं? कोड की एक पंक्ति के पीछे, पॉलिसी, जैसा कि कॉन्फ़िगर किया गया है, एक नीति में असाइनमेंट / अपडेट को आसानी से किया जाता है, सभी को सोर्स कोड पुनः कंपाइल किए बिना।

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

मैं जटिल कहूँगा, लेकिन नहीं overengineered तो मेरा विचार यह है कि रखरखाव के दौरान बड़ा लाभांश देखा जाएगा जब आप आसानी से कॉन्फ़िगरेशन को बदलने के लिए लचीलेपन से निपटने / अपवाद को संभालने के तरीके को बदलने के लिए आवश्यक हैं, और फिर भी स्रोत कोड की एक ही पंक्ति


यदि आप नियंत्रण प्रवाह के लिए अपवादों का उपयोग करते हैं, तो आप नीति आधारित अपवाद प्रबंधन से दूर रहना चाहते हैं।

लेकिन अपवादों के मामले में जिसे आप बिना वसूली योग्य (एक पृष्ठभूमि कार्य विफल, गर्तिका डिस्कनेक्ट कर दिया गया था, फ़ाइल हटाई गई थी आदि) के रूप में इलाज करना चाहते हैं, तो आप कॉन्फ़िगर करने योग्य, नीति-आधारित अपवाद हैंडलिंग चाहते हैं।

उदाहरण के लिए, यदि आप एक एपीआई विकसित कर रहे हैं, तो आप अपने एपीआई में प्रत्येक फ़ंक्शन को केवल मानक अपवाद ( ArgumentException , आदि) में फेंक सकते हैं, साथ ही एक आंतरिक गैर-मानक के मामले में अपने स्वयं के पुस्तकालय-विशिष्ट अपवाद अपवाद (जैसे एक MyLibraryException ) इस प्रकार के मामले में, सभी मामलों में यह है कि कुछ ठीक से काम नहीं कर रहा था। आप अपवाद को अलग नहीं कर रहे हैं और यह पता लगा रहे हैं कि गलत क्या हुआ। आप बस इस बात को स्वीकार करते हैं कि कुछ चीज गलत हो गई है, और अब आपको कुछ करना है।

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

(एक तरफ, यह नहीं है कि मैं कैसे कॉन्फ़िगरेबल पॉलिसी-आधारित अपवाद-हैंडलिंग का उपयोग करूँगा। मैं एओपी शैली की दिशा में और अधिक हो जाता हूं, जैसे कंटेनर में एक अपवाद-लॉगर इंटरसेप्टर दर्ज करना।


काफी आसानी से: यदि आप अपने डिबग कोड की तुलना में अपने रिलीज कोड में भिन्न अपवाद हैंडलिंग चाहते हैं, तो यह उपयोगी होगा





application-blocks