2008-09-10 5 views
24

अपवादों के संबंध में previous question पर फॉलो-अप में, .NET में कस्टम अपवाद बनाने के लिए सर्वोत्तम प्रथाएं क्या हैं?अपना खुद का कस्टम अपवाद बनाने के लिए कुछ सर्वोत्तम अभ्यास क्या हैं?

अधिक विशेष रूप से आप System.Exception, System.ApplicationException या कुछ अन्य आधार अपवाद से विरासत चाहिए?

+0

यह प्रश्न देखें:

उत्तर

16
System.Exception से

इनहेरिट। System.ApplicationException बेकार है और डिजाइन के दिशा निर्देशों कहते हैं कि "मत फेंक या System.ApplicationException से निकाले जाते हैं।"

देखें http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx

+0

तो अनुप्रयोग अपवाद का बिंदु क्या है? – UpTheCreek

+5

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

+0

@ मार्ककिडाडे: तथ्य यह है कि कुछ सीएलआर अपवाद 'एप्लिकेशन एक्सेप्शन' से प्राप्त होते हैं, वास्तव में एक अच्छी बात हो सकती है यदि अपवादों के बीच पदानुक्रम में लगातार अंतर होता है जिसका अर्थ है "ऑपरेशन सफल नहीं हो सका, लेकिन प्रयास ने कुछ भी नहीं किया ; यदि आप इसके लिए तैयार हैं, तो महान ", बनाम" कुछ इतनी ग़लत गलती हो गई है कि लगभग हर चीज भ्रष्ट मानी जानी चाहिए; केवल चीजों को बंद नहीं करने का एकमात्र कारण होगा अगर कोई डायग्नोस्टिक जानकारी कैप्चर करना चाहता है या स्वचालित रूप से ट्रिगर करना चाहता है पहले लॉन्च करें। " बहुत बुरा कोई ऐसा भेद नहीं है। – supercat

1

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

1

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

5

इसके लिए एक कोड स्निपेट है। उसका उपयोग करें। इसके अलावा, बाद में अपना कोड विश्लेषण जांचें; स्निपेट उन रचनाकारों में से एक को छोड़ देता है जिन्हें आपको लागू करना चाहिए।

26

सी # आईडीई, प्रकार 'अपवाद' में और टैब दबाएं। यह एक नया अपवाद प्रकार लिखने में शुरू करने के लिए विस्तारित होगा। अपवाद प्रथाओं की कुछ चर्चाओं के साथ टिप्पणियां हैं।

व्यक्तिगत रूप से, मैं छोटी कक्षाएं की बहुत सारी बनाने का एक बड़ा प्रशंसक हूँ, कि अपवाद टाइप तक फैली हुई है। उदाहरण के लिए, फू वर्ग लिखित रूप में, मैं चुन सकते हैं के बीच:

  1. throw new Exception("Bar happened in Foo");
  2. throw new FooException("Bar happened");
  3. throw new FooBarException();

जहां

class FooException : Exception 
{ 
    public FooException(string message) ... 
} 

और

class FooBarException : FooException 
{ 
    public FooBarException() 
     : base ("Bar happened") 
    { 
    } 
} 

मैं तीसरा विकल्प पसंद करता हूं, क्योंकि मैं इसे ओओ समाधान के रूप में देखता हूं।

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