2010-06-21 22 views
6

.NET में, अपवादों को पकड़ते समय, क्या मुझे हमेशा व्युत्पन्न अपवादों को पकड़ना चाहिए (इसलिए ArgumentException लेकिन व्युत्पन्न प्रकार नहीं)?सबसे व्युत्पन्न अपवादों को पकड़ें?

इसके अलावा

:

मैं त्रुटि कोड का उपयोग करने के लिए कहा रहा हूँ, तो यह इतना ?:

फेंक नया अपवाद ("4000", पूर्व) की तरह निर्माता में हो सकता है;

या एक त्रुटि अपवाद प्रकार के साथ एक कस्टम अपवाद प्रकार? (यह एसक्यूएलएक्सप्शन जैसे अपवाद प्रकारों के साथ भ्रमित हो सकता है जिसमें SQL सर्वर त्रुटियों में त्रुटि कोड मैपिंग है)।

धन्यवाद

+0

त्रुटि कोड कहां से आते हैं? क्या वे त्रुटि कोड देशी Win32 त्रुटि कोड हैं? –

उत्तर

6
  1. सबसे व्यापक अपवाद को पकड़ें जो आपको पता है कि कैसे संभालना है।

    सामान्यतः, इसका मतलब है कि आप एक सुंदर विशिष्ट अपवाद को पकड़ लेंगे। और कुछ अपवाद, जैसे ArgumentException एस, सभी बी/सी पर पकड़े नहीं जाना चाहिए, वे रनटाइम त्रुटि के विपरीत तर्क तर्क इंगित करते हैं। एक जगह जहां मुझे व्यापक अपवाद को पकड़ने में पाया गया है, फ़ाइल I/O के मामले में उपयोगी है। एक IOException पकड़ने के लिए एक व्यावहारिक उच्च स्तरीय अपवाद हो सकता है।

  2. यदि आपको त्रुटि कोड का उपयोग करने के लिए कहा जाता है, तो आप इसे लपेटने के अपवाद की संदेश प्रॉपर्टी का उपयोग कर दूर हो सकते हैं, लेकिन मैं इसे उचित टाइप किए गए अपवाद को फेंकने से बचने के कारण के रूप में कभी भी इसका उपयोग नहीं करूँगा। ऐसा इसलिए है क्योंकि यहां दो अलग-अलग चिंताएं हैं:

    ए। एरर कोड जानकारी का एक विशिष्ट टुकड़ा प्रदान करने के लिए है जो फ़ील्ड में विफलता के मामले में देखा जा सकता है। इसे अपवाद प्रकारों के बीच भेदभाव के लिए कभी भी इस्तेमाल नहीं किया जाना चाहिए प्रोग्रामिंग रूप से बी/सी भाषा के लिए एक विशिष्ट सुविधा है: अपवाद प्रकार।

    बी। अपवादों के बीच अंतर करने का एक प्रोग्रामेटिक तरीका प्रदान करने के लिए उपयुक्त टाइप अपवाद है। भाषा इसके लिए डिज़ाइन की गई है, इसका इस्तेमाल करें। कभी एक सादा Exception फेंक न दें।

    मैं शायद Exception.Data collection में एक त्रुटि कोड फेंक दूंगा। यह Exception.Message में संदेशों को ओवरराइट करने से बचाता है जो अन्यथा नैदानिक ​​उद्देश्यों के लिए बहुत उपयोगी होंगे।

+0

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

2

इस पर निर्भर करता है अगर आप एक सटीक अपवाद या अपवाद के विभिन्न प्रकार के एक समूह को पकड़ने के लिए चाहते हैं।

कभी-कभी आप केवल 1 सटीक अपवाद के लिए हैंडलिंग जोड़ना चाहते हैं। अन्य बार आपका अपवाद हैंडलिंग किसी भी प्रकार के अपवाद के लिए समान होगा ताकि अपवाद क्या है, यह देखने के लिए आप पकड़ सकते हैं या Exception पकड़ सकते हैं।

उदाहरण के लिए आप केवल 1 सटीक अपवाद और कोई अन्य अपवाद हैंडलिंग नहीं पकड़ सकते हैं। आप ऐसा करेंगे जब आप कॉल स्टैक को आगे जानते हैं तो आप शेष अपवादों को पकड़ रहे हैं लेकिन आप केवल उस व्यक्ति को अनदेखा करना चाहते हैं जिसे आप बिल्कुल पकड़ रहे हैं।

संबंधित मुद्दे