2010-02-04 26 views
47

सी # में मैं अपने स्वयं के अपवाद कैसे परिभाषित करूं?सी # में मैं अपने स्वयं के अपवाद कैसे परिभाषित करूं?

+5

कुडोस (लेकिन कोई +1 नहीं) जितना संभव हो उतना शब्दों के साथ एक समझदार प्रश्न पूछने के लिए। –

+0

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

+0

@ जोएल - आप जो कहते हैं उसकी सावधानी बरतें। माइक्रोसॉफ्ट बेस्ट प्रैक्टिस दस्तावेज़ कस्टम अपवादों के संबंध में खुद का विरोधाभास करता है। मैंने अपना जवाब बदल दिया क्योंकि ओपी का उपयोग अनुप्रयोग अपवाद की दिशा में अधिक स्पष्ट लगता है। विरोधाभासों के बारे में इस पोस्ट को देखें: http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx –

उत्तर

38

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

http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx

कोई और एक लड़ाई है!

CA1058: Types should not extend certain base types


एक नया वर्ग है कि अपवाद से विरासत को परिभाषित करें (मैं कर दिया है: जिसमें कहा गया है कि अपने अपवाद System.Exception बजाय System.ApplicationException से विरासत चाहिए FxCop नियम CA1058 ओर इशारा करते हुए के लिए फ्रेडरिक के लिए धन्यवाद कुछ निर्माताओं शामिल हैं ... लेकिन आप) उन्हें नहीं करना पड़ेगा: फेंकने के लिए अपने कोड में

using System; 
using System.Runtime.Serialization; 

[Serializable] 
public class MyException : Exception 
{ 
    // Constructors 
    public MyException(string message) 
     : base(message) 
    { } 

    // Ensure Exception is Serializable 
    protected MyException(SerializationInfo info, StreamingContext ctxt) 
     : base(info, ctxt) 
    { } 
} 

और कहीं:

throw new MyException("My message here!"); 

संपादित

एक Serializable अपवाद सुनिश्चित करने के लिए परिवर्तन के साथ अपडेट किया गया। चरणों अगर आप अपने अपवाद वर्ग के लिए कस्टम गुण जोड़ने लिया जाना चाहिए कि के बारे में अनुभाग के लिए

Winterdom Blog Archive - Make Exception Classes Serializable

वेतन ध्यान: विवरण यहां पाया जा सकता।

इगोर के लिए मुझे कॉल करने के लिए धन्यवाद!

+0

@ रोबिन ... संपादन के लिए धन्यवाद। मुझे एहसास हुआ कि मैं कोड के रूप में प्रारूपित करना भूल गया था और यह पहले ही तय हो गया था। –

+2

@ जस्टिन निसेनर: यदि आप इसे AppDomains –

+1

पर फेंकने में सक्षम होना चाहते हैं तो आपको अपना कस्टम अपवाद सीरियलज़ेबल बनाना होगा। एप्लिकेशन अपवाद से प्राप्त करने की अनुशंसा नहीं की जाती है। यह आपके विरासत पदानुक्रम को किसी भी अच्छे कारण के लिए बढ़ाता है। http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx और http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx – Venr

11

को परिभाषित करने के लिए:

public class SomeException : Exception 
{ 
    // Add your own constructors and properties here. 
} 

फेंक करने के लिए:

throw new SomeException(); 
+0

धन्यवाद !!!!!!!!!!!!!! –

+0

आप 'try' और' कुछ अपवाद() पकड़ सकते हैं; '। टक्कर बीटीडब्ल्यू। –

2

परिभाषा:

public class CustomException : Exception 
{ 
    public CustomException(string Message) : base (Message) 
    { 
    } 
} 

फेंक:

throw new CustomException("Custom exception message"); 
61

दिशानिर्देश अपने स्वयं के अपवाद

  • यकीन है कि वर्ग, serializable है [Serializable] विशेषता
  • आम कंस्ट्रक्टर्स कि द्वारा किया जाता है प्रदान करते हैं जोड़कर बनाना (तथ्य यह है कि अपने वर्ग अपवाद से विरासत चाहिए करने के लिए अगले) बनाने के लिए अपवाद:

    MyException(); 
    
    MyException (string message); 
    
    MyException (string message, Exception innerException); 
    

तो, आदर्श, अपने कस्टम Exception कम से कम इस तरह दिखना चाहिए:

[Serializable] 
public class MyException : Exception 
{ 
    public MyException() 
    {} 

    public MyException (string message) 
     : base(message) 
    {} 

    public MyException (string message, Exception innerException) 
     : base (message, innerException) 
    {}  
} 

तथ्य है कि क्या आप Exception या ApplicationException से विरासत चाहिए के बारे में:

CA1058: Microsoft.Design:
बदलें आधार FxCop एक नियम है जो आप ApplicationException से इनहेरिट बचना चाहिए कहते है 'MyException' का प्रकार ताकि यह अब 'एप्लिकेशन अपवाद' को विस्तारित नहीं करता है। यह आधार अपवाद प्रकार फ्रेमवर्क कक्षाओं के लिए अतिरिक्त मान प्रदान नहीं करता है। 'System.Exception' या को मौजूदा अनदेखा अपवाद प्रकार बढ़ाएं। अपवादों की एक पूरी कक्षा के लिए कैच हैंडलर के निर्माण को सक्षम करने में सक्षम होने पर मान विशिष्ट मान आधार प्रकार न बनाएं।

इस नियम के बारे में the page on MSDN देखें।

-3

आप अपना अपवाद परिभाषित कर सकते हैं।

उपयोगकर्ता परिभाषित अपवाद वर्ग ApplicationException कक्षा से प्राप्त किए गए हैं।

आप नीचे दिए गए कोड देख सकते हैं:

using System; 
namespace UserDefinedException 
{ 
    class TestTemperature 
    { 
     static void Main(string[] args) 
     { 
     Temperature temp = new Temperature(); 
     try 
     { 
      temp.showTemp(); 
     } 
     catch(TempIsZeroException e) 
     { 
      Console.WriteLine("TempIsZeroException: {0}", e.Message); 
     } 
     Console.ReadKey(); 
     } 
    } 
} 
public class TempIsZeroException: ApplicationException 
{ 
    public TempIsZeroException(string message): base(message) 
    { 
    } 
} 
public class Temperature 
{ 
    int temperature = 0; 
    public void showTemp() 
    { 
     if(temperature == 0) 
     { 
     throw (new TempIsZeroException("Zero Temperature found")); 
     } 
     else 
     { 
     Console.WriteLine("Temperature: {0}", temperature); 
     } 
    } 
} 

और एक अपवाद फेंकने के लिए,

आप एक वस्तु अगर यह प्रत्यक्ष या अप्रत्यक्ष रूप System.Exception वर्ग से प्राप्त होता है फेंक कर सकते हैं

Catch(Exception e) 
{ 
    ... 
    Throw e 
} 
+0

डाउनवॉटेड के रूप में इसे .NET 2.0 के बाद अपवाद (अनुप्रयोग अपवाद नहीं) को उपclass करने की अनुशंसा की गई है। यह भी इस सवाल के अन्य उत्तरों में स्पष्ट रूप से कहा गया है। – Andy

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