2008-09-09 16 views
72

.NET समाधान में अपवाद कक्षाएं बनाते समय सबसे अच्छा अभ्यास क्या है: System.Exception से या System.ApplicationException से प्राप्त करने के लिए?क्या मुझे .NET में अपवाद या एप्लिकेशन अपवाद से कस्टम अपवाद प्राप्त करना चाहिए?

उत्तर

57

फ्रेमवर्क डिजाइन दिशानिर्देश पुस्तक में जेफ़री रिक्टर के अनुसार:

System.ApplicationException एक वर्ग जो .NET ढांचे का हिस्सा नहीं होना चाहिए।

इसका उद्देश्य कुछ अर्थ होना था कि आप संभावित रूप से "सभी" एप्लिकेशन अपवादों को पकड़ सकते हैं, लेकिन पैटर्न का पालन नहीं किया गया था और इसलिए इसका कोई मूल्य नहीं है।

+2

जब कोई एमसीटीएस 70-536 परीक्षा के लिए माइक्रोसॉफ्ट प्रेस सामग्री को समझता है तो अविश्वसनीय रूप से विपरीत कहता है ... गह! –

+0

एमएस परीक्षा पुस्तकों पर पूरी तरह भरोसा न करें। मैंने उनमें से कुछ पढ़ा है - हमेशा त्रुटियों से भरा है। – user1068352

+0

यह वास्तव में सवाल का जवाब नहीं देता है। क्या आप कह रहे हैं कि कस्टम अपवाद अपवाद 'अपवाद' से प्राप्त होना चाहिए? यदि हां, तो क्या आप ऐसा कह सकते हैं? –

18

ApplicationException considered uselessApplicationException के खिलाफ एक मजबूत, और महत्वपूर्ण, तर्क है।

उपशॉट: इसका उपयोग न करें। Exception से प्राप्त करें।

+0

हाँ, कोनराड यह अधिकार नहीं है। संबंधित नोट पर: एक और चीज उपयोगी (या "सर्वोत्तम अभ्यास") सोचती है लेकिन वास्तव में नहीं है [आईसीएलनेबल लागू करना] (http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx)। – Craig

13

ढांचे के लेखकों ने खुद को ApplicationException बेकार पर विचार करें:

http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx

संदेह होने पर, मैं अपनी किताब फ्रेमवर्क डिजाइन का पालन करें: एक अच्छा अनुवर्ती यहाँ के साथ

http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx

दिशा-निर्देश।

http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

ब्लॉग पोस्ट के विषय आगे वहाँ चर्चा की है।

आरपी

1

मैं ऐसा करने के लिए इस्तेमाल कर रहा हूँ:

  • सी # कोड सिस्टम त्रुटि मरम्मत कि मैं करना होगा:

    private void buttonFoo_Click() 
    { 
        try 
        { 
         foo(); 
        } 
        catch(ApplicationException ex) 
        { 
         Log.UserWarning(ex); 
         MessageVox.Show(ex.Message); 
        } 
        catch(Exception ex) 
        { 
         Log.CodeError(ex); 
         MessageBox.Show("Internal error."); 
        } 
    } 
    

    यह बीच का अंतर करने के लिए अनुमति देते हैं।

  • "सामान्य" उपयोगकर्ता त्रुटि जो मुझे सुधार की आवश्यकता नहीं है।

मुझे पता है कि एप्लिकेशन अपवाद का उपयोग करने की अनुशंसा नहीं की जाती है, लेकिन यह very few classes है जो अनुप्रयोग अपवाद पैटर्न का सम्मान नहीं करता है क्योंकि यह बहुत अच्छा काम करता है।

+2

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

+0

आप सही: आज, अगर मुझे खरोंच से शुरू करना पड़ा, तो मैं एक "उपयोगकर्ता त्रुटि" अपवाद तैयार करूंगा। फिर भी, मैं अपने पुराने कोड को दोबारा नहीं बदलूंगा: यह बहुत आलोचना नहीं है। –

21

आपको System.Exception से कस्टम अपवाद प्राप्त करना चाहिए।

यहां तक ​​कि MSDN अब ApplicationException अनदेखी करने के लिए कहते हैं:

आप किसी अनुप्रयोग अपनी ही अपवाद बनाने की जरूरत है कि रचना कर रहे हैं, तो आप अपवाद वर्ग से कस्टम अपवाद प्राप्त करने के लिए सलाह दी जाती है।यह मूल रूप से सोचा गया था कि कस्टम अपवाद एप्लिकेशन अपवाद वर्ग से प्राप्त होना चाहिए; हालांकि अभ्यास में यह महत्वपूर्ण मूल्य जोड़ने के लिए नहीं मिला है। अधिक जानकारी के लिए, Best Practices for Handling Exceptions देखें।

http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx

+1

उद्धरण कहता है कि, लेकिन ठीक है, अधिक स्पष्ट होने के लिए संपादित किया गया है। – Blorgbeard

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