2011-03-15 25 views
21

मैं वर्तमान में सी # सीख रहा हूं, लेकिन मैं कुछ पर फंस गया हूं और मुझे इसके लिए कोई समाधान नहीं मिल रहा है।
मैं अपनी खुद की अपवाद कक्षा बनाने की कोशिश कर रहा हूं।कस्टम सी # अपवाद कैसे बनाएं?

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

अब तक मैं MSDN पर पाया गया कि अपवाद बनाने के लिए मैं इन चार कंस्ट्रक्टर्स की जरूरत है:

public class InvalidNumberException : System.Exception 
{ 
    public InvalidNumbertException() : base() { } 
    public InvalidNumberException(string message) : base(message) { } 
    public InvalidNumberException(string message, System.Exception inner) : base(message, inner) { } 

    // A constructor is needed for serialization when an 
    // exception propagates from a remoting server to the client. 
    protected InvalidNumberException(System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) { } 
} 

लेकिन मैं विधि या इस वर्ग में निर्माता है कि एक नंबर से प्रवेश किया लागू करने के लिए पता नहीं कैसे कंसोल 5 के बराबर है, और यदि यह नहीं है, तो यह एक अपवाद फेंकता है।

अगर कोई मुझे इससे मदद करता है तो मैं सराहना करूंगा।

+0

ओटी, आपको चार रचनाकारों को स्वयं लिखना नहीं चाहिए। बस आपको जरूरी जरूरतों को लागू करें। 'पब्लिक क्लास अमान्य नम्बर अपवाद: अपवाद {}' काम करना चाहिए यदि आप जो कुछ भी करने जा रहे हैं वह है 'नया अमान्य नम्बर अपवाद(); –

+2

यह ध्यान देने योग्य है कि आपको कस्टम अपवाद नहीं बनाना चाहिए जब तक कि आपको वास्तव में आवश्यकता न हो। पहले इसके बारे में बहुत सावधानी से सोचें। Http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx –

उत्तर

22

आप उन सभी निर्माताओं की जरूरत नहीं है:

तो अपने कोड की तरह लग सकता है। आपके द्वारा बनाए जा रहे अपवाद के बारे में सोचें - यह सुनिश्चित करने के लिए कि int!=5 है।

तो, मैं इस तरह एक भी निर्माता होगा:

public InvalidNumberException(int value) 
    : base(String.Format("Some custom error message. Value: {0}", value)) { } 

और इस तरह इसका इस्तेमाल:

if (number == 5) 
    throw new InvalidNumberException(number); 

आपको लगता है कि लपेटकर नहीं किया जाना चाहिए एक try ब्लॉक में। इस कोड को सीधे ऊपर कोड ब्लॉक निष्पादित करता अपवाद के लिए देखने के लिए की काम है, जैसे:

try 
{ 
    CallSomeMethodWhichChecksTheNumberAndThrowsIfNecessary(); 
} 
catch (InvalidNumberException inex) 
{ 
    // do something, print to console, log, etc 
} 

मैं इस आशा करती हूं कि सिर्फ झुकाव क्योंकि इस उद्देश्य के लिए Int32.Parse और Int32.TryParse तरीकों है वहाँ के लिए - एक कस्टम अपवाद कक्षा की आवश्यकता नहीं है।

27

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

if (number == 5) 
    throw new InvalidNumberException(); 
+0

देखें आप अपवाद में संख्या को पास करना चाह सकते हैं एक सार्थक संदेश प्रदर्शित करें। –

+0

वह अपवाद के भीतर संख्या की जांच करने के बारे में बात कर रहा है। यह संदेश प्रदर्शित करता है असंबंधित है। –

4

एक अपवाद यह अर्थ निकलता है कि कुछ दिया परिस्थितियों में अपने कार्यक्रम का कहना है कि यह सामान्य रूप से निष्पादित नहीं कर सकते हैं और गर्भपात चाहिए फेंकने से। आप इसे इतना पसंद करते हैं:

if (conditionMet) 
    throw new Exception(); 

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

जब भी सीएलआर आपके "नए फेंक" कथन को निष्पादित करता है तो यह वर्तमान कोड पथ के निष्पादन को रोक देगा और उस अपवाद को संभालने वाले कैच स्टेटमेंट की तलाश करेगा।

try 
{ 
    if (number == 5) 
     throw new InvalidNumberException(); 
} 
catch (InvalidNumberException e) 
{ 
    System.Console.WriteLine("Hey I got an InvalidNumberException"); 
} 
8

स्वीकृत उत्तर गलत है!

public InvalidNumberException(int value) 
{ 
    var message = string.Format("Some custom error message. Value: {0}", value); 
    base(message, this.InnerException) 
} 

यह यह करने के लिए एक बेहतर तरीका है:

स्वीकार किए जाते हैं जवाब से

public InvalidNumberException(int value) : base(string.Format("Some custom error message. Value: {0}", value)) { } 
+0

क्या आप समझा सकते हैं कि स्वीकृत उत्तर गलत क्यों है? – numaroth

+2

स्वीकृत उत्तर इस कोड का उपयोग करने के लिए संपादित किया गया है –

0

यह जरूरी सच नहीं है सब फेंक दिया अपवाद त्रुटियों को निरस्त करने के लिए नेतृत्व करेंगे के लिए कर रहे हैं कि आपके ऐप - जब तक वे बिना छेड़छाड़ किए पकड़े जाते हैं, वह है;)।

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

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