एक अपवाद एक अवरुद्ध त्रुटि है ।
सबसे पहले, सबसे अच्छा अभ्यास किसी भी तरह की त्रुटि के लिए अपवाद नहीं फेंकना चाहिए , जब तक कि यह एक अवरुद्ध त्रुटि न हो ।
यदि त्रुटि अवरुद्ध है , तो अपवाद को फेंक दें। एक बार अपवाद पहले ही फेंक दिए जाने के बाद, इसे छिपाने की कोई आवश्यकता नहीं है क्योंकि यह असाधारण है; उपयोगकर्ता को इसके बारे में बताएं (आपको UI में उपयोगकर्ता के लिए उपयोगी कुछ के लिए पूरे अपवाद को पुन: स्वरूपित करना चाहिए)।
सॉफ़्टवेयर डेवलपर के रूप में आपका काम एक असाधारण मामले को रोकने का प्रयास करना है जहां कुछ पैरामीटर या रनटाइम स्थिति अपवाद में समाप्त हो सकती है। यही है, अपवादों को म्यूट नहीं किया जाना चाहिए, लेकिन इनसे बचा जाना चाहिए ।
उदाहरण के लिए, यदि आप जानते हैं कि कुछ पूर्णांक इनपुट अमान्य प्रारूप के साथ आ सकते हैं, int.TryParse
इसके बजाय उपयोग करें int.Parse
। बहुत सारे मामले हैं जहां आप यह कहने के बजाय ऐसा कर सकते हैं "यदि यह विफल रहता है, तो बस एक अपवाद फेंक दें"।
अपवाद फेंकना महंगा है।
यदि, आखिरकार, एक अपवाद को फेंक दिया जाता है, तो एक बार फेंक दिए जाने के बाद लॉग को अपवाद लिखने के बजाय, सबसे अच्छा अभ्यासों में से एक इसे पहले-मौका अपवाद हैंडलर में पकड़ रहा है । उदाहरण के लिए:
- ASP.NET: Global.asax Application_Error
- अन्य: AppDomain.FirstChanceException घटना ।
मेरा रुख यह है कि विशेष मामलों को संभालने के लिए स्थानीय प्रयास / कैच बेहतर होते हैं, जहां आप किसी अपवाद का दूसरे में अनुवाद कर सकते हैं, या जब आप इसे बहुत, बहुत, बहुत, बहुत विशेष मामले (लाइब्रेरी बग) के लिए "म्यूट" करना चाहते हैं एक असंबंधित अपवाद को फेंकना जो आपको पूरे बग को हल करने के लिए म्यूट करने की आवश्यकता है)।
बाकी मामलों के लिए:
- अपवादों से बचने की कोशिश करें।
- यदि यह संभव नहीं है: पहला मौका अपवाद हैंडलर।
- या एक PostSharp पहलू (AOP) का उपयोग करें।
कुछ कमेंट पर @thewhiteambit का जवाब ...
@ वेधशाला ने कहा:
अपवाद घातक-त्रुटियां नहीं हैं, वे अपवाद हैं! कभी-कभी वे एरर भी नहीं होते हैं, लेकिन उन पर विचार करने के लिए फेटल-एरर्स पूरी तरह से झूठी समझ है कि अपवाद क्या हैं।
सबसे पहले, कैसे एक अपवाद भी एक त्रुटि नहीं हो सकती है?
- कोई डेटाबेस कनेक्शन => अपवाद नहीं।
- कुछ प्रकार => अपवाद के लिए पार्स करने के लिए अमान्य स्ट्रिंग प्रारूप
- JSON को पार्स करने की कोशिश करना और जबकि इनपुट वास्तव में JSON => अपवाद नहीं है
- तर्क,
null
जबकि वस्तु अपेक्षित थी => अपवाद
- कुछ पुस्तकालय में एक बग => एक अप्रत्याशित अपवाद फेंकता है
- एक सॉकेट कनेक्शन है और यह डिस्कनेक्ट हो जाता है। फिर आप एक संदेश भेजने का प्रयास करते हैं => अपवाद
- ...
हम 1k मामलों को सूचीबद्ध कर सकते हैं जब एक अपवाद फेंक दिया जाता है, और आखिरकार, संभावित मामलों में से कोई भी एक त्रुटि होगी ।
एक अपवाद है , एक त्रुटि क्योंकि दिन के अंत में यह एक वस्तु जो नैदानिक जानकारी एकत्र करता है - यह एक संदेश है और यह तब होता है जब कुछ गलत हो जाता।
जब कोई असाधारण मामला नहीं है, तो कोई भी अपवाद नहीं फेंकेगा। अपवादों को त्रुटियों को रोकना चाहिए क्योंकि एक बार जब वे फेंक दिए जाते हैं, यदि आप नियंत्रण प्रवाह को लागू करने की कोशिश / पकड़ और अपवादों में नहीं पड़ते हैं, तो उनका मतलब है कि आपका आवेदन / सेवा एक असाधारण मामले में दर्ज किए गए ऑपरेशन को रोक देगा ।
इसके अलावा, मैं सभी को सुझाव देता हूं कि मार्टिन फॉलर (और जिम शोर द्वारा लिखित) द्वारा प्रकाशित असफल-तेज प्रतिमान की जांच करें । कुछ समय पहले इस दस्तावेज़ को प्राप्त करने से पहले ही मुझे यह समझ में आ गया था कि अपवादों को कैसे संभालना है।
[...] उन पर विचार करें कि घातक-त्रुटियां पूरी तरह से गलत हैं कि अपवाद क्या हैं।
आमतौर पर अपवादों में कुछ ऑपरेशन प्रवाह में कटौती होती है और उन्हें मानव-समझने योग्य त्रुटियों में बदलने के लिए नियंत्रित किया जाता है। इस प्रकार, यह एक अपवाद की तरह लगता है कि वास्तव में त्रुटि मामलों को संभालने और एक आवेदन / सेवा पूर्ण दुर्घटना से बचने और उपयोगकर्ता / उपभोक्ता को सूचित करने के लिए उन पर काम करने के लिए एक बेहतर प्रतिमान है कि कुछ गलत हुआ।
@Thewhiteambit चिंताओं के बारे में अधिक जवाब
उदाहरण के लिए एक लापता डेटाबेस-कनेक्शन के मामले में कार्यक्रम एक स्थानीय फ़ाइल में लिखने के साथ असाधारण रूप से जारी रह सकता है और डेटाबेस को फिर से उपलब्ध होने पर परिवर्तन भेज सकता है। आपकी अमान्य स्ट्रिंग-टू-नंबर कास्टिंग को अपवाद पर भाषा-स्थानीय व्याख्या के साथ फिर से पार्स करने की कोशिश की जा सकती है, जैसे आप पार्स ("1,5") के लिए डिफ़ॉल्ट अंग्रेजी भाषा का प्रयास करते हैं, विफल रहता है और आप इसे जर्मन व्याख्या के साथ फिर से कोशिश करते हैं जो पूरी तरह से है ठीक है क्योंकि हम विभाजक के रूप में बिंदु के बजाय अल्पविराम का उपयोग करते हैं। आप देखते हैं कि इन अपवादों को अवरुद्ध नहीं किया जाना चाहिए, उन्हें केवल कुछ अपवाद-हैंडलिंग की आवश्यकता है।
यदि आपका ऐप डेटाबेस में डेटा को बनाए रखने के बिना ऑफ़लाइन काम कर सकता है, तो आपको अपवादों का उपयोग नहीं करना चाहिए , क्योंकि नियंत्रण प्रवाह को लागू करने का उपयोग try/catch
एक विरोधी पैटर्न के रूप में माना जाता है। ऑफ़लाइन कार्य संभव उपयोग का मामला है, इसलिए आप यह जानने के लिए नियंत्रण प्रवाह को लागू करते हैं कि डेटाबेस सुलभ है या नहीं, आप तब तक प्रतीक्षा नहीं करते जब तक कि यह अनुपलब्ध न हो ।
पार्स बात भी एक उम्मीद मामले (है असाधारण नहीं मामला )। यदि आप यह उम्मीद करते हैं, तो आप नियंत्रण प्रवाह करने के लिए अपवादों का उपयोग नहीं करते हैं! । आपको यह जानने के लिए उपयोगकर्ता से कुछ मेटाडेटा मिलता है कि उसकी संस्कृति क्या है और आप इसके लिए फॉर्मेटर्स का उपयोग करते हैं! .NET इस और अन्य वातावरणों का भी समर्थन करता है, और एक अपवाद क्योंकि नंबर स्वरूपण से बचना चाहिए यदि आप अपने एप्लिकेशन / सेवा के संस्कृति-विशिष्ट उपयोग की अपेक्षा करते हैं ।
एक अखंडित अपवाद आमतौर पर एक त्रुटि बन जाता है, लेकिन अपवाद स्वयं कोडप्रोजेक्ट नहीं होते हैं। विज्ञापन / विज्ञापन / 15921/Not-All-Exception-Are-Errors
यह लेख केवल एक राय है या लेखक का दृष्टिकोण है।
चूँकि विकिपीडिया पर केवल लेखिका की राय हो सकती है, इसलिए मैं यह नहीं कहूंगा कि यह हठधर्मिता है , लेकिन जाँच करें कि अपवाद लेख द्वारा कोडिंग कहीं किसी पैराग्राफ में क्या कहता है:
[...] प्रोग्राम को जारी रखने के लिए उत्पन्न होने वाली विशिष्ट त्रुटियों को संभालने के लिए इन अपवादों का उपयोग करना अपवाद द्वारा कोडिंग कहा जाता है। यह विरोधी पैटर्न प्रदर्शन और रखरखाव में सॉफ़्टवेयर को जल्दी से ख़राब कर सकता है।
यह भी कहीं कहता है:
गलत अपवाद उपयोग
अक्सर अपवाद द्वारा कोडिंग सॉफ्टवेयर में गलत अपवाद उपयोग के साथ आगे के मुद्दों को जन्म दे सकती है। एक अद्वितीय समस्या के लिए अपवाद हैंडलिंग का उपयोग करने के अलावा, गलत अपवाद उपयोग अपवाद को उठाने के बाद भी कोड निष्पादित करके इसे आगे ले जाता है। यह खराब प्रोग्रामिंग विधि कई सॉफ्टवेयर भाषाओं में गोटो विधि से मिलती जुलती है, लेकिन सॉफ्टवेयर में समस्या का पता लगने के बाद ही होती है।
ईमानदारी से, मेरा मानना है कि सॉफ़्टवेयर को विकसित नहीं किया जा सकता है और उपयोग के मामलों को गंभीरता से नहीं लेना चाहिए। अगर आपको पता है कि ...
- आपका डेटाबेस ऑफ़लाइन हो सकता है ...
- कुछ फ़ाइल लॉक की जा सकती हैं ...
- कुछ स्वरूपण का समर्थन नहीं किया जा सकता है ...
- कुछ डोमेन सत्यापन विफल हो सकते हैं ...
- आपका एप्लिकेशन ऑफ़लाइन मोड में काम करना चाहिए ...
- जो भी उपयोग मामला ...
... आप इसके लिए अपवादों का उपयोग नहीं करेंगे । आप नियमित नियंत्रण प्रवाह का उपयोग करके इन मामलों का समर्थन करेंगे ।
और अगर कुछ अनपेक्षित उपयोग के मामले को कवर नहीं किया गया है, तो आपका कोड तेजी से विफल हो जाएगा, क्योंकि यह एक अपवाद फेंक देगा । सही है, क्योंकि एक अपवाद एक असाधारण मामला है ।
दूसरे हाथ में, और अंत में, कभी-कभी आप असाधारण अपवादों को कवर करते हैं जो अपेक्षित अपवादों को फेंकते हैं , लेकिन आप उन्हें नियंत्रण प्रवाह को लागू करने के लिए नहीं फेंकते हैं। आप ऐसा इसलिए करते हैं क्योंकि आप ऊपरी परतों को सूचित करना चाहते हैं कि आप कुछ उपयोग के मामले का समर्थन नहीं करते हैं या आपका कोड कुछ दिए गए तर्कों या पर्यावरण डेटा या गुणों के साथ काम करने में विफल रहता है।