2011-01-25 11 views
57

सी # में कस्टम अपवादों को लागू करने के लिए उद्योग मानक सर्वोत्तम प्रथाएं क्या हैं?सी # में कस्टम अपवादों को लागू करने के लिए उद्योग मानक सर्वोत्तम प्रथाओं क्या हैं?

मैंने Google की जांच की है और वहां बड़ी संख्या में सिफारिशें हैं, हालांकि मुझे नहीं पता कि कौन से अधिक विश्वसनीयता रखते हैं।

यदि किसी के पास आधिकारिक लेखों के कोई लिंक हैं, तो यह भी सहायक होगा।

+1

http://bit.ly/hVTSgp की ही तरह मैं सुझाव है कि आप आगे बताते हुए आपको जो खोज रहे हैं द्वारा अपने विषय को संकीर्ण। –

+0

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

+7

लगता है जैसे आप व्यापार तर्क प्रवाह को संभालने के लिए अपवादों का उपयोग कर रहे हैं - अपेक्षित जहां संभव हो अपवादों के उपयोग के बिना मुद्दों का सामना किया जाना चाहिए। – cjk

उत्तर

64

कस्टम अपवाद बनाने के लिए मानक Exception से प्राप्त करने के लिए है। फिर आप अपनी खुद की संपत्ति/विधियों और अधिभारित कन्स्ट्रक्टर (यदि लागू हो) पेश कर सकते हैं।

यहां कस्टम ConnectionFailedException का एक मूल उदाहरण है जो अपवाद के प्रकार के लिए विशिष्ट पैरामीटर लेता है।

[Serializable] 
public class ConnectionFailedException : Exception 
{ 
    public ConnectionFailedException(string message, string connectionString) 
     : base(message) 
    { 
     ConnectionString = connectionString; 
    } 

    public string ConnectionString { get; private set; } 
} 

एप्लिकेशन में यह उन परिदृश्यों में उपयोग किया जा सकता है जहां एप्लिकेशन किसी डेटाबेस से कनेक्ट करने का प्रयास कर रहा है।

try 
{ 
    ConnectToDb(AConnString); 
} 
catch (Exception ex) 
{ 
    throw new ConnectionFailedException(ex.Message, AConnString); 
} 

यह आप पर निर्भर है तो एक उच्च स्तर पर ConnectionFailedException को संभालने के लिए (यदि लागू हो)

इसके अलावा Designing Custom Exceptions पर एक नज़र और Custom Exceptions

+2

कूल धन्यवाद @ जेम्स ... बहुत उपयोगी – scarpacci

+0

क्यों कनेक्शन कनेक्शन अपवादों के अपवादों को पकड़ना क्यों अधिक उद्देश्यपूर्ण नहीं है? –

+0

@ अनार उदाहरण दिखाता है * कैसे * आप 'कनेक्शनफेल अपवाद' को बढ़ाते हैं, उम्मीद है कि आप कॉल स्टैक को उच्चतर पकड़ लेंगे। आप सामान्य 'अपवाद' की बजाय 'कनेक्टटॉडीबी' से उठाए गए एक और अधिक सार्थक अपवाद को पकड़ सकते हैं, हालांकि, यह केवल प्रदर्शन उद्देश्यों के लिए था। – James

8

मुझे लगता है कि आप अपवाद हैंडलिंग प्रथाओं की तलाश में हैं। तो, निम्न लेख पर नजर है

http://msdn.microsoft.com/en-us/library/ms229014.aspx // कस्टम अपवाद सहित अपवाद के बारे में समग्र विचारों देता

http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx //

8

यहाँ है एक कस्टम अपवाद बनाने के लिए कोड है:

using System; 
using System.Runtime.Serialization; 

namespace YourNamespaceHere 
{ 
    [Serializable()] 
    public class YourCustomException : Exception, ISerializable 
    { 
     public YourCustomException() : base() { } 
     public YourCustomException(string message) : base(message) { } 
     public YourCustomException(string message, System.Exception inner) : base(message, inner) { } 
     public YourCustomException(SerializationInfo info, StreamingContext context) : base(info, context) { } 
    } 
} 

यह भी देखें: http://www.capprime.com/software_development_weblog/2005/06/16/CreatingACustomExceptionClassInC.aspx

+0

FWIW - यह विजुअल स्टूडियो में शामिल 'अपवाद' स्निपेट का उपयोग करने से लगभग बिल्कुल ठीक है। –

+0

उत्कृष्ट। मैंने 2005 में ब्लॉग पोस्ट लिखा था, लेकिन मुझे लगता है कि माइक्रोसॉफ्ट से कुछ मार्गदर्शन था कि मैंने इसे चालू किया और ऐसा लगता है कि मार्गदर्शन को स्निपेट के माध्यम से वीएस में कोडित किया गया था। –

0

मैं त्रुटि की प्रकृति को संवाद करने के लिए कस्टम अपवादों का उपयोग करता हूं।

उदाहरण के लिए, मुझे तर्कों की जांच करने के लिए "ArgumentNullException" प्रदान किए गए ढांचे का उपयोग करना पसंद है। फिर बाद में, जब मैं डीबगर में या त्रुटि लॉग में यह त्रुटि देखता हूं, तो मुझे तुरंत बिना पढ़ने के त्रुटि की प्रकृति पता है।

स्पेक्ट्रम का दूसरा छोर अमान्यऑपरेशन अपवाद है जिसका अर्थ बहुत कुछ हो सकता है।

कस्टम अपवादों का विकल्प विस्तृत त्रुटि संदेश है। यह ठीक है, लेकिन कस्टम अपवाद बनाकर जैसे कनेक्शन कनेक्शन अधिक अर्थपूर्ण है। फिर संदेश स्वयं अधिक जानकारी दे सकता है।

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

तो उपवर्गीकरण बहुत सरल है:

public class NavigationException : Exception{ 
    public NavigationException() {} 
    public NavigationException(string msg) : base(msg) {} 
    public NavigationException(string msg, Exception inner) : base(msg, inner) {} 
} 

यह बहुत स्पष्ट है, किसी भी त्रुटि लकड़हारा के साथ काम करता है, और जब मैं इसे देख, मैं जानता हूँ कि यह एक नेविगेशन समस्या थी और यदि आवश्यक हो मैं विवरण देख सकते हैं ।

ग्रेग

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

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