2012-11-18 23 views
6

मैंने पढ़ा है और अब निम्न सवालों और गहराई से लेख और कई अन्य लोगों पर चर्चा की और अतीत में:कोशिश-पकड़ कथन के साथ मुझे किस प्रकार के कोड ब्लॉक संलग्न करना चाहिए?

When to use try/catch blocks?

Main method code entirely inside try/catch: Is it bad practice?

When to use Try Catch blocks

मैं इस लेख के कोडिंग मानक कर देगा मेरे संगठन में अपवाद हैंडलिंग! यहाँ http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET

What is the Best practice for try catch blocks to create clean code?

Best practices for exception management in Java or C# : एवरी अच्छा एक लेकिन मुझे जवाब नहीं था कि मैं इस बयान :( आप हर संभव जगह में प्रत्येक और हर अपवाद को पकड़ने की कोशिश नहीं करनी चाहिए पसंद नहीं आया।

Should multiple Try/Catch blocks in a method be combined

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

एक और उदाहरण: मैं डाटाबेस तक पहुंचने के लिए एंटीटीफ्रेमवर्क का उपयोग कर रहा हूं, कुछ एक्सेस करते समय डेटाबेस से संपर्क कर सकते हैं, मुझे पता है कि अगर बंद हो तो मुझे कनेक्शन की जांच करनी चाहिए और इसे खोलने का प्रयास करना चाहिए, लेकिन कई और कई चीजें विफल हो सकती हैं इस कथन में, डेटाबेस एक हटाने योग्य ड्राइव पर हो सकता है, पढ़ने के दौरान इस ड्राइव को हटाया जा सकता है, डीबीएमएस की सेवा किसी भी कारण से रुक सकती है, कोई स्पेस अपवाद नहीं फेंक दिया जा सकता है, डेटाबेस की योजना बदलने के बाद बदल सकती है कुछ **** कारणों के लिए अपना कोड निष्पादित करें, मैं अपने कोड को असफल होने से कैसे रोक सकता हूं, क्या मैं बस हर चीज की जांच कर सकता हूं जिसे मैं देख सकता हूं, और आगे बढ़ सकता हूं? या मुझे अपवाद के लिए प्रयास करने का प्रयास करना चाहिए, भले ही मैंने उन्हें जांच लिया हो?

मुझे अपने उत्तरों के संदर्भ दें कृपया, सामान्य उत्तर नहीं!

संपादित

और यकीन है कि यह पढ़ें: http://msdn.microsoft.com/en-us/library/seyhszts.aspx

+0

अगर आप नीचे मतदान करते हैं तो कृपया एक टिप्पणी करें! –

+0

आप केवल देखभाल करते हैं कि अगर आप कोड में इसे सही करने के लिए काम कर सकते हैं, या काम करने के इच्छुक हैं तो यह विफल क्यों हुआ। अन्यथा आप केवल अपवाद लॉग और लॉगौती कर सकते हैं। अधिकांश ऐप्स को आपके द्वारा प्रस्तावित मजबूती के प्रकार की आवश्यकता नहीं होती है, कुछ करते हैं। – PatFromCanada

उत्तर

4

अच्छा प्रश्न है! आपके लिंक में से एक (Daniel Turini) मेरे पसंदीदा में से एक है। मैं बार-बार वापस जाता हूं जब मेरी सोच को कुछ सीधा करने की ज़रूरत होती है।

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

इस तरह के डिज़ाइन का सीधा विपरीत अपवाद-हैंडलिंग है जो ऐप को "परमाणु-आर्मगेडन-उत्तरजीवी" बनाने का प्रयास करता है। पर कोशिश करता है ... मैंने कोड देखा है जो नेटवर्क फ़ाइल-सर्वर को मानकर आईओ त्रुटियों का जवाब देता है, और सी: ड्राइव पर कुछ अवांछित तरीके से काम करने की कोशिश करने के लिए शाखाएं। और कोड जो उपयुक्त से चुनने का प्रयास करता है: यदि तालिका मौजूद नहीं है, तो यह इसे बनाता है !!! हर बार जब कोई इस तरह कोड लिखता है, तो एक बच्चा मर जाता है।

टुरिनी का कहना है कि "कभी अपवाद निगलें"। जो मैं सोच रहा हूं वह इसका विस्तार है: आईएमएचओ आपको ज्ञात, निश्चित प्रकार के अपवाद के जवाब में, एक ज्ञात कारण के साथ, एक ऐप को आगे बढ़ाने के बारे में बहुत सावधान रहना होगा: क्योंकि यहां तक ​​कि यह "निगलने" अपवाद भी बनाता है । ऐसा करो, लेकिन इसे ध्यान से और अच्छी तरह से करें।

तो मेरे सोचने के तरीके में हमेशा एक सामान्य "किसी भी अन्य मामले" अपवाद-हैंडलर के लिए जगह होती है, जो कि क्या होता है और बस बंद करने के विवरण को लॉग करके उच्च शक्ति (एक इंसान) के निर्णय का प्रतिनिधित्व करता है अप्प।

मेरे 2c ..

+0

मुझे लगता है कि उचित निष्पादन यह सुनिश्चित करना चाहिए कि अप्रत्याशित अपवाद किसी भी डेटा संरचनाओं को अमान्य कर दें जो सामान्य निष्पादन अनुक्रम से अप्रत्याशित प्रस्थान के परिणामस्वरूप दूषित हो सकता है। यदि कोड उन डेटा संरचनाओं के बिना जीवित रह सकता है, तो यह चाहिए। यदि नहीं हो सकता है, तो डेटा संरचनाओं को अमान्य करने से यह सुनिश्चित हो जाएगा कि यह जल्दी से मर जाए। यदि कोड 'लोडडॉक्यूमेंट' को कॉल करता है और अपवाद प्राप्त करता है, तो उसे यह जानने की आवश्यकता नहीं होनी चाहिए कि ऑपरेशन यह जानने में विफल रहा है कि क्या यह क्रैश होना चाहिए या बस रिपोर्ट करें कि फ़ाइल को पढ़ा नहीं जा सका। – supercat

0

IMHO:, या के शरीर में अपने आवेदन, दुर्घटनाग्रस्त हो जाने से अपने अनुप्रयोग को रोकने के लिए (UI में की अंतिम परत में हर अपवाद पकड़ो, अपने कंसोल अनुप्रयोग के शरीर में कुछ सेवा विधि ... आदि) और यदि आप इसे कम से कम लॉग इन कर सकते हैं, तो इसे संभालें, लेकिन आंतरिक परतों में, केवल अपवादों को पकड़ें जिन्हें आप उन्हें पूरी तरह से संभालने के लिए जानते हैं, और अपवादों को फेंक दें या उन्हें सही तरीके से लपेटें संभालने का तरीका, लेकिन यदि आपके कोड में परतों के बीच कोई स्पष्ट सीमा नहीं है (मेरे मामले में वही) तो आपको अपवादों को संभालने का प्रयास करना चाहिए, और इस ऐप को रीसेट करने (पुनः लिखने) को आजमाएं (जैसा कि हम जल्द ही करेंगे!) में एक अच्छी तरह से निर्मित रास्ता!