किसी भी विधि या कोड के ब्लॉक में जहां आप विशिष्ट अपवादों की अपेक्षा कर सकते हैं (डेटाबेस या किसी के साथ बातचीत करना) बाहरी सेवा जो उपलब्ध हो सकती है या नहीं भी हो सकती है)। प्रश्न में विशिष्ट अपवादों को पकड़ने के लिए उस कोड को एक कोशिश/पकड़ में लपेटें। आप जानना चाहते हैं कि उन्हें सही तरीके से संभालने के लिए किस तरह के अपवाद हुए हैं। (स्वाभाविक रूप से, किसी भी खुले संसाधनों का निपटान करने के लिए अंत में ब्लॉक का उपयोग करें।) उन्हें सही तरीके से कैसे संभालना है आप पर निर्भर है और आप अपने आवेदन को कैसे व्यवहार करना चाहते हैं।
आपको निश्चित रूप से क्रैश के माध्यम से अप्रत्याशित कुछ भी पकड़ने के लिए वैश्विक अपवाद हैंडलिंग होना चाहिए। पर बिंदु पर उपयोगकर्ता को एक अनचाहे अपवाद बबल होना चाहिए। वैश्विक अपवाद हैंडलर को उपयोगकर्ता को एक दोस्ताना त्रुटि संदेश के साथ प्रस्तुत करना चाहिए और अपवाद को लॉग इन करना चाहिए और आपको जो हुआ उसके बारे में सूचित करना चाहिए। आम तौर पर, एक अच्छा लक्ष्य अपवाद की पहचान करना और वैश्विक स्तर पर बुलबुले से पहले इसे अपने स्थानीयकृत स्थिति में पकड़ने के लिए त्रुटि हैंडलिंग कोड जोड़ना है। समय के साथ लक्ष्य जितना संभव हो उतना वैश्विक अपवाद होना चाहिए और किसी भी संभावित अपवाद-उत्पन्न कोड के पास उन मामलों के खिलाफ सुरक्षा के लिए अपनी स्वयं की त्रुटि प्रबंधन होनी चाहिए।
उत्तरार्द्ध का एक उदाहरण null
तर्क प्राप्त करने वाली किसी विशेष विधि के रूप में सरल हो सकता है जिसे आप उन तर्कों का उपयोग करने से पहले जांचना चाहते हैं। एक चीज जिसे आप टालना चाहते हैं, हालांकि, तर्क प्रवाह के लिए अपवाद हैंडलिंग का उपयोग कर रहा है।
public MyMethod(MyObject obj)
{
// ...
}
आपका मूल कोड मानता है कि obj
हमेशा एक मूल्य होगा: उदाहरण के लिए ...
मान लीजिए कि आप एक तरीका है जिसके एक तर्क के रूप में एक कस्टम वस्तु लेता करते हैं। हालांकि, उत्पादन के कुछ समय बाद, आप पाते हैं कि obj
कभी-कभी null
होता है और यह उस विधि के भीतर से NullReferenceException
फेंक रहा है, जिसे वैश्विक अपवाद हैंडलर द्वारा पकड़ा जा रहा है।
आप उस अपवाद को पकड़ने के लिए अपने स्वयं के प्रयास/कैच ब्लॉक में MyMethod
में कोड को लपेटने के लिए प्रेरित हो सकते हैं। यह जरूरी नहीं है कि यह एक अच्छा विचार है (हालांकि ऐसे मामले हो सकते हैं जहां यह है)। इसके बजाय, आप विधि के शुरू में null
के लिए जाँच करना चाहते हैं:
public MyMethod(MyObject obj)
{
if (obj == null) throw new ArgumentNullException("obj can not be NULL");
// ...
}
इस विधि बेहतर समाहित है और इसे नियंत्रित अपवाद फेंकने के लिए अनुमति देता है। अपवाद खराब चीजें नहीं हैं, केवल अप्रत्याशित अपवाद हैं। ध्यान दें कि उपर्युक्त अभी भी अपवाद फेंक देगा जो अभी भी वैश्विक हैंडलर तक बबल होगा। इस प्रकार, को पकड़ने के लिए प्रयास करें और इसे तदनुसार संभाल लें ताकि को इस विधि के लिए प्रयास/कैच ब्लॉक में लपेटें। शायद इस विधि को कॉल करने वाला कोड शून्य संदर्भ को ठीक कर सकता है और पुनः प्रयास कर सकता है, शायद यह कुछ और कोशिश कर सकता है।यदि आप संभव हो तो भी वैश्विक ग्लोबलर को बबल करना नहीं चाहते हैं, क्योंकि यह एक "अपेक्षित" अपवाद बन गया है और तदनुसार इसे संभाला जा सकता है।
स्वाभाविक रूप से, आप अभी भी उपरोक्त उदाहरण में अपेक्षित अपवादों को फेंकने/पकड़ने से बचना चाहते हैं, इसलिए null
के लिए समान जांच विधि को कॉल करने से पहले होनी चाहिए ताकि विधि को भी बुलाया न जाए।
हो सकता है कि वस्तु है अगर null
आप सीधे एक त्रुटि संदेश उपयोगकर्ता को लगभग और त्रुटि लॉग इन करें और संभव के रूप में चीजों की स्थिति के बारे में अधिक से अधिक जानकारी के बारे में सूचित करें ताकि आप क्यों यह null
है अनुसंधान और इसे ठीक कर सकते हैं कर सकते हैं। हो सकता है कि null
उस समय उस ऑब्जेक्ट की पूरी तरह स्वीकार्य स्थिति है जो आवेदन के तर्क के अनुसार है। यदि ऐसा है, तो जांचें कि यह null
है और विधि को कॉल करने से परेशान न हों। बस सामान्य के रूप में जारी रखें।
यह बहुत त्रुटि-जांच और हैंडलिंग कोड है, लेकिन यह एक अच्छी बात है।
संपादित करें: अपवाद हैंडलिंग के बारे में नोट करने के लिए एक और बात यह है कि आप अपवाद केवल पकड़ने चाहिए है अगर आप कर सकते हैं वास्तव में उस समय संभाल यह। यदि विधि इसे आंतरिक रूप से संभाल नहीं सकती है, तो अपवाद को विधि से कॉलिंग विधि तक अपवाद दें, और इसी तरह। इस प्रकार, वैश्विक हैंडलर तक पहुंचने वाले एकमात्र अपवाद अपवाद हैं जिन्हें आप वास्तव में कोड में कहीं भी संभाल नहीं सकते हैं (यही कारण है कि वैश्विक अपवादों को ठीक करने और रोकने के लिए यह एक अच्छा लक्ष्य है)।
इस मामले में "हैंडल" वास्तव में इसके बारे में कुछ करने में सक्षम होने का मतलब होगा। हो सकता है कि कुछ इसे लॉग ऑन करना और आगे बढ़ना है, हो सकता है कि कुछ विशिष्ट तर्क आदि करना है, लेकिन पकड़ने, लॉग करने और फिर से फेंकना खराब डिजाइन है। यदि आप अपवाद से पुनर्प्राप्त नहीं हो सकते हैं, तो इसे बबल करें।
धन्यवाद डेविड, संक्षेप में मुझे मॉडल या नियंत्रक (जहां मॉडल ऑब्जेक्ट्स कहा जाता है) में अपवाद और लॉग अप करना चाहिए? –
@flybyte: दोनों। कहीं भी आपके पास कोड है जो त्रुटि उत्पन्न या संभाल सकता है, आपको वहां त्रुटि-जांच और त्रुटि-कोडिंग कोड डालना चाहिए। मॉडल में आमतौर पर अधिक होगा, क्योंकि मॉडल में सभी व्यावसायिक तर्क शामिल होना चाहिए। नियंत्रक यूआई से कुछ बुनियादी इनपुट जांच कर सकते हैं, मॉडल अपने राज्य को सत्यापित कर सकते हैं और सेवाओं के साथ बातचीत करते समय त्रुटियों को संभाल सकते हैं। – David
तो आप सुझाव दे रहे हैं कि मॉडल को कभी भी नियंत्रक को ग्लोबा.एएसपीएक्स पर अपवाद नहीं फेंकना चाहिए? मैंने जो किया है वह मॉडल में कोशिश करें और पकड़ो। मॉडल तब नियंत्रक को फेंक देता है जो तब global.aspx पर जाता है जहां बबुल किए गए किसी भी उत्साह को लॉग किया जाएगा। –