exception - meaning - सामान्य अपवाद क्यों नहीं पकड़ते हैं




एक्सेप्शन मीनिंग इन हिंदी (7)

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

मेरे वीएस ने मुझे अभी बताया;

चेतावनी 2 सीए 1031: माइक्रोसॉफ्ट। डिज़ाइन: 'अपवाद' से अधिक विशिष्ट अपवाद को पकड़ने के लिए 'प्रोग्राम' मेन (स्ट्रिंग []) 'संशोधित करें या अपवाद को दोबारा हटाएं।

मुझे ऐसा क्यों करना चाहिए? यदि मैं ऐसा करता हूं, और उन्हें संभालने के लिए सभी अपवादों को नहीं पकड़ता, तो मेरा प्रोग्राम सभी लोकप्रिय रिपोर्ट-स्क्रीन के साथ दुर्घटनाग्रस्त हो जाता है। मैं नहीं चाहता कि मेरे उपयोगकर्ता इस तरह के त्रुटि-बकवास प्राप्त करें!

मुझे उपयोगकर्ता को एक अच्छी चेतावनी दिखाने के लिए एक बार में सभी अपवादों को क्यों नहीं पकड़ना चाहिए: "कुछ गड़बड़ हुई, इसके बारे में परवाह नहीं है, मैं इसे संभालेगा, बस धैर्य रखें"?

संपादित करें : बस देखा कि मेरे पास एक डुप्ली है, उस Dupe लिए खेद है

संपादन 2 : चीजों को स्पष्ट करने के लिए; किसी अपवाद को पकड़ने के बाद मैं प्रोग्राम से बाहर निकलता हूं! मैं नहीं चाहता कि मेरे उपयोगकर्ता को "माइक्रोसॉफ्ट को रिपोर्ट करें" संवाद दिखाई दे, जो एक कंसोल-एप्लिकेशन में एक अनचाहे अपवाद उठाए जाने पर दिखाई देता है!


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


चूंकि आपका चेतावनी संदेश दिखाता है कि यह मुख्य () में है, मुझे लगता है कि निम्न स्तरों में, आप केवल अधिक विशिष्ट अपवादों को पकड़ते हैं।

मुख्य () के लिए, मैं दो मामलों पर विचार करता हूं:

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

यह अच्छी तरह से करने के लिए, बस जांचें कि क्या DEBUG परिभाषित किया गया है (और इसे परिभाषित करें, यदि वीएस स्वचालित रूप से ऐसा नहीं करता है):

#if DEBUG
  yadda(); // Check only specific Exception types here
#else
  try
  {
    yadda();
  }
  catch (Exception e)
  {
     ShowMessage(e); // Show friendly message to user
  }
#endif

मैं सामान्य अपवादों को पकड़ने के बारे में चेतावनी को अक्षम कर दूंगा, लेकिन केवल आपके मुख्य () फ़ंक्शन के लिए, किसी अन्य विधि में अपवाद को पकड़ना मूर्खतापूर्ण है, क्योंकि अन्य पोस्टर पहले ही कह चुके हैं।


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

संपादित करें: यूआई घटकों, और सेवा या मिडलवेयर घटक के बीच भेद स्पष्ट करने के लिए।

सेवा या मिडलवेयर घटकों में, जहां कोई भी कोड उस कोड स्थान के भीतर कोड घटक के साथ इंटरैक्ट नहीं कर रहा है, जिसमें कोड चल रहा है, घटक को अपवाद को "पास ऑन" करने की आवश्यकता होती है, जो कि क्लाइंट घटक ने उस कॉल को अपनाने की आवश्यकता है जो वर्तमान में प्रसंस्करण कर रहा है । अपवाद से कोई फर्क नहीं पड़ता, इसे करने के लिए हर संभव प्रयास करना चाहिए। यह अभी भी मामला है, हालांकि, उन मामलों में tjhat जहां एक अप्रत्याशित, या अप्रत्याशित अपवाद होता है, घटक अंततः उस प्रक्रिया को समाप्त कर देना चाहिए जिसमें यह चल रहा है। अनुमानित या अपेक्षित अपवादों के लिए, यह निर्धारित करने के लिए एक वेलोपमेंट विश्लेषण किया जाना चाहिए या नहीं, उस विशिष्ट अपवाद के लिए, घटक और इसकी होस्ट प्रक्रिया संचालित हो सकती है (भविष्य के अनुरोधों को संभालना), या क्या इसे समाप्त किया जाना चाहिए।


निगलने के अपवाद एक खतरनाक अभ्यास है क्योंकि:

  • यह उपयोगकर्ता को असफल होने पर कुछ सफल होने का कारण बन सकता है।
  • यह आपके आवेदन को उन राज्यों में डाल सकता है जिनके लिए आपने योजना नहीं बनाई थी।
  • यह डिबगिंग को जटिल बनाता है, क्योंकि यह पता लगाना बहुत मुश्किल है कि विफलता तब हुई जब आप स्टैक ट्रेस के बजाय विचित्र / टूटे व्यवहार से निपट रहे थे।

जैसा कि आप शायद कल्पना कर सकते हैं, इनमें से कुछ परिणाम बेहद विनाशकारी हो सकते हैं, इसलिए यह अधिकार करना एक महत्वपूर्ण खरगोश है।

सर्वश्रेष्ठ प्रणालियां

सबसे पहले, कोड रक्षात्मक रूप से ताकि अपवाद आवश्यक से अधिक नहीं हो। वे कम्प्यूटेशनल रूप से महंगा हैं।

जब संभव हो तो एक दानेदार स्तर पर अपेक्षित अपवादों को FileNotFoundException (उदाहरण के लिए: FileNotFoundException )।

अप्रत्याशित अपवादों के लिए, आप दो चीजों में से एक कर सकते हैं:

  • उन्हें सामान्य रूप से बुलबुला करने और एक दुर्घटना का कारण बनने दें
  • उन्हें पकड़ो और कृपा से विफल

गर्व से विफल?

मान लीजिए कि आप एएसपी.Net में काम कर रहे हैं और आप अपने उपयोगकर्ताओं को मौत की पीली स्क्रीन नहीं दिखाना चाहते हैं, लेकिन आप भी देव टीम से समस्याओं को छिपाना नहीं चाहते हैं।

हमारे अनुप्रयोगों में, हम आमतौर पर global.asax में global.asax अपवादों को पकड़ते हैं और फिर लॉगिंग करते हैं और अधिसूचना ईमेल भेजते हैं। हम एक और अधिक अनुकूल त्रुटि पृष्ठ भी दिखाते हैं, जिसे customErrors टैग का उपयोग कर web.config में कॉन्फ़िगर किया जा सकता है।

यह हमारी रक्षा की आखिरी पंक्ति है, और यदि हम एक ईमेल प्राप्त करना समाप्त करते हैं तो हम तुरंत उस पर कूदते हैं।

उस प्रकार का पैटर्न अपवादों को निगलने जैसा नहीं है, जहां आपके पास एक खाली कैच ब्लॉक है जो केवल "नाटक" करने के लिए मौजूद है कि अपवाद नहीं हुआ था।

अन्य नोट

वीएस -2010 में, इंटेलिट्रेस आने वाला कुछ ऐसा है जो आपको वास्तव में एप्लिकेशन स्टेटस को घर वापस भेज सकता है और कोड के माध्यम से कदम उठा सकता है, अपवाद के समय चर मूल्यों की जांच कर सकता है, और इसी तरह। यह बेहद उपयोगी होगा।


वीएस में आप अपने उपयोगकर्ताओं को दिखाने के लिए एक कस्टम त्रुटि पृष्ठ सेट अप कर सकते हैं जब इसे किसी प्रयास में पकड़ने के बजाय कुछ गलत हो जाता है। मुझे लगता है कि आप वीएस का उपयोग कर रहे हैं क्योंकि आप एएसपी .NET का उपयोग कर रहे हैं। यदि ऐसा है तो इस टैग को अपने वेब पर जोड़ें। सिस्टम के अंतर्गत कॉन्फ़िगर करें। वेब टैग:

<customErrors mode="RemoteOnly" defaultRedirect="~/CustomErrorPage.aspx" redirectMode="ResponseRewrite" />

आप Global.asax फ़ाइल में सभी बेजोड़ अपवाद भी प्राप्त कर सकते हैं (यदि आपके पास पहले से नहीं है: वेब प्रोजेक्ट पर राइट-क्लिक करें, आइटम जोड़ें चुनें, और इसके लिए खोजें)। उस एप्लिकेशन में "एप्लिकेशन_इरर" जैसी एप्लिकेशन विस्तृत एप्लिकेशन हैंडलर का एक गुच्छा है जो आपके अपॉइंटमेंट में पकड़े गए प्रत्येक अपवाद को पकड़ता है, इसलिए आपको हर समय Try-Catch का उपयोग करने की आवश्यकता नहीं है। यदि कोई अपवाद होता है और संभवतः उन्हें अपने होमपेज या कुछ पर रीडायरेक्ट करने के लिए स्वयं को ईमेल भेजने के लिए उपयोग करना अच्छा होता है यदि आप उपरोक्त कस्टमर टैग टैग का उपयोग नहीं करना चाहते हैं।

लेकिन आखिरकार आप अपने पूरे एप्लिकेशन को एक कोशिश में लपेटना नहीं चाहते हैं और न ही आप एक सामान्य अपवाद पकड़ना चाहते हैं। कोशिश-पकड़ आमतौर पर आपके आवेदन को धीमा कर देते हैं और कई बार यदि आप हर सामान्य अपवाद को पकड़ते हैं तो यह संभव हो सकता है कि आप महीनों या साल बाद तक बग मौजूद नहीं रहें क्योंकि प्रयास-पकड़ ने आपको इसे अनदेखा कर दिया है।


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

एमएसडीएन SuppressMessageAttribute





exception