2011-07-01 11 views
6

मुझे उत्सुकता है कि System.ComponentModel.InvalidEnumArgumentException फेंकने के बाद आप अपना कोड कैसे बनाए रखेंगे।आप अवैधEnumArgumentException के साथ कोड कैसे बनाए रखते हैं?

मूल रूप से मैं इस तरह एक स्विच बयान है:

switch (enumValue) 
{ 
    case MyEnum.Value1: 
     break; 

    case MyEnum.Value2: 
     break; 

    default: 
     throw new InvalidEnumArgumentException(); 
} 

क्या होगा यदि मैं अधिक मान, उदाहरण के लिए भविष्य में MyEnum में जोड़ने के लिए, Value3 और Value4 फैसला? इसका मतलब यह होगा कि मैं एक भ्रामक अपवाद फेंकना समाप्त कर दूंगा। मैं इसे कैसे रोकूं?

क्या मुझे फेंकने से पहले प्रतिबिंब का उपयोग करना चाहिए? इस मामले में मुझे क्या अपवाद फेंकना चाहिए? मैं सुझावों की तलाश में हूं।


मैंने अभी कुछ मिनट पहले इस अपवाद की खोज की है, तो शायद मैं इसे गलत संदर्भ में देख रहा हूं। क्या यह अपवाद फेंक दिया जाता है जब एक निश्चित enum तर्क समर्थित नहीं है (किस मामले में Value3 और Value4 समर्थित नहीं होगा)?

उत्तर

0

मैं उस संदर्भ में उस अपवाद का उपयोग नहीं कर रहा हूं जिसका आप उपयोग कर रहे हैं। EnumValue के आधार पर MyEnum (मुझे लगता है?) में यह एक अवैध enum मान कभी नहीं हो सकता है। यदि आपके पास एनम के मूल्य के आधार पर स्विच हैं जो विफल होने की आवश्यकता है, यदि वे मूल्य को नहीं पहचानते हैं तो आपको उचित अपवाद (शायद केवल एक सामान्य तर्क अपवाद) फेंकने की आवश्यकता होगी, लेकिन ज्यादातर मामलों में मुझे लगता है कि आप चाहते हैं कोड चलाने से अज्ञात enum मान के लिए कुछ भी नहीं करते हैं।

+2

यह गलत है। [डिजाइन दिशानिर्देशों के लिए यह अतिरिक्त] के अनुसार [http://blogs.msdn.com/b/kcwalina/archive/2004/05/18/134208.aspx), "किसी भी पूर्णांक मूल्य को एक enum में डालना कानूनी है भले ही मूल्य enum में परिभाषित नहीं किया गया है। " –

+0

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

+1

ठीक है मैं कभी नहीं। ऐसा लगता है कि मैंने आज कुछ नया सीखा है। :-) – DoctorMick

2

आप एक गलत तरह से अपवाद का उपयोग कर रहे:

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

यदि आप एक विधि को गलत गणन मान पास या जब एक संपत्ति की स्थापना इस अपवाद फेंक दिया है।

+4

तो क्या अपवाद फेंक दिया जाना चाहिए? – mbx

0

मेरा मानना ​​है कि आप इसे गलत संदर्भ में देख रहे हैं, अगर ये enum नहीं थे लेकिन कुछ विशिष्ट मूल्य जो कुछ व्यापार नियमों पर आधारित थे, ऐसे में जैसे नियमों में वृद्धि होती है, आप प्रासंगिक कोड जैसे स्पर्श करेंगे इन्हें नए शामिल करने के लिए। तो यदि आप एनम को संशोधित कर रहे हैं तो आपको इन तरह के बदलावों के लिए चारों ओर देखना चाहिए।

+0

यदि इस तरह के स्विच स्टेटमेंट्स के साथ कई जगहें हैं, तो एक ऐसे कारखाने में हो सकता है जो एनम वैल्यू के आधार पर पॉलीमोर्फिक ऑब्जेक्ट्स बनाता है, और उस ऑब्जेक्ट को उस ऑब्जेक्ट के तरीकों से स्विचेस से ले जाएं – driushkin

8

आपके द्वारा बताई गई समस्या संदर्भ पर निर्भर करती है, अगर किसी विधि को तर्क के रूप में गणना प्राप्त होती है तो उसे यह निर्दिष्ट करना होगा कि यह कौन से मूल्यों का समर्थन करता है और यह अज्ञात गणना मूल्य के साथ क्या करता है।

यदि आप अधिक गणना विकल्प जोड़ते हैं तो आपको यह तय करने की आवश्यकता है कि क्या करना है, भले ही आप डिफ़ॉल्ट मामले में अपवाद नहीं फेंक रहे हों।

याद दिलाएं कि अपवाद विशेष सहायक है क्योंकि आप किसी भी पूर्णांक को गणना मूल्य के रूप में पारित कर सकते हैं।

उदाहरण के लिए

:

enum Foo { A, B } 

static int Bar(Foo f) 
{ 
    switch (f) 
    { 
     case Foo.A: 
      return 1; 
     case Foo.B: 
      return 2; 
     default: 
      throw new InvalidEnumArgumentException("f", (int)f, typeof(Foo)); 
    } 
} 

static void Main() 
{ 
    Bar(Foo.A); 
    Bar((Foo)99); 
} 
+2

उदाहरण पर मामूली सुधार केवल लक्ष्य नेट 4.6 या ऊपर लक्ष्यीकरण है '' f ''स्ट्रिंग को' nameof (f)' से बदलना है। – skkeeper

1

प्रमाणित करने के लिए भेजे गणन मूल्य निम्नलिखित स्थिर विधि का उपयोग करें ...

public void MyMethod(MyEnum e) 
{ 
    if (!Enum.IsDefined(typeof(MyEnum), e)) 
     throw new InvalidEnumArgumentException("e", (int)e, typeof(MyEnum)); 

... और आप अगर नए enum जांच में परिवर्तन करने की जरूरत नहीं है भविष्य में मूल्य जोड़े गए हैं।

+1

यदि MyEnum को नए मानों के साथ बढ़ाया गया है, तो '! Enum.IsDefined (typeof (MyEnum), e)) 'उनके लिए सच वापस आ जाएगा, इसलिए यह परीक्षण कभी भी असफल नहीं होगा। – Spook

+0

@Spook लेकिन यह विफल हो जाएगा यदि MyEnum '0' के लिए प्रविष्टि को परिभाषित नहीं करता है और ई को पूर्ण रूप से 'MyEnum e' में डिफ़ॉल्ट मान असाइन किया जाता है; MyMethod (e); 'या जब कोड संख्यात्मक रूप से 'e' मान सेट करता है। मुद्दा यह है कि सी # स्वयं 'ई' को 'MyEnum 'के लिए मान्य मान नहीं देता है और, बस, आप कुछ भी नहीं मान सकते हैं। – binki

4

यदि मैं भविष्य में MyEnum में अधिक मूल्य जोड़ने का निर्णय लेता हूं, उदाहरण के लिए, Value3 और Value4? इसका मतलब यह होगा कि मैं एक भ्रामक अपवाद फेंकना समाप्त कर दूंगा। मैं इसे कैसे रोकूं?

जब आप को समझने के लिए InvalidEnumArgumentException कुंजी बात का उपयोग कर रहे तर्क है। अपवाद फेंक कर आप कह रहे हैं कि विधि के लिए तर्क अमान्य था। (InvalidEnumArgumentExceptionArgumentException से निकला है।) इसका मतलब यह नहीं है कि मान enum का सदस्य नहीं था। तो मैं इसे भ्रामक नहीं मानूंगा।