2009-11-10 28 views
8

क्या मुझे default पर फेंकना चाहिए, अगर मेरे पास सभी संभावित एनम प्रकारों के मामले हैं?स्विच स्टेटमेंट में डिफ़ॉल्ट मामले पर NotImplementedException फेंकना

+2

मुझे लगता है कि यह आपके ऐप पर निर्भर करेगा और यदि आप सीमा के बाहर मूल्य के साथ समाप्त हो जाएंगे तो क्या होगा। – Joe

उत्तर

13

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

लेकिन अब आपको संदर्भ पर विचार करना होगा।

क्या विधि निजी है, और केवल आपकी कक्षा पुस्तकालय या एप्लिकेशन के सदस्यों द्वारा ही सुलभ है? यदि ऐसा है, तो यह एक कोडिंग त्रुटि है जो पहले कभी नहीं होनी चाहिए। जोर दें और असफल हो जाएं।

यदि दूसरी ओर, यह एक सार्वजनिक या संरक्षित विधि है, और आपकी लाइब्रेरी का उपभोग करने वाले ग्राहकों द्वारा इसका उपयोग किया जा सकता है, तो आपको निश्चित रूप से एक सार्थक संदेश (और अधिमानतः एक प्रसिद्ध अपवाद प्रकार) के साथ फेंक देना चाहिए।

यह याद रखना महत्वपूर्ण है कि फ्रेमवर्क में गणनाओं की गणना नहीं की जाती है। मैं निर्दिष्ट कर सकता हूं कि एक विधि को पर्यावरण के प्रकार के पैरामीटर की आवश्यकता होती है। SpecialFolder; लेकिन यह किसी भी 32-बिट पूर्णांक मान को स्वीकार करेगा।

तो, संक्षेप में, यदि आपकी विधि सार्वजनिक उपभोग के लिए है, हाँ, हर तरह से, फेंक दें। यदि यह सार्वजनिक उपभोग के लिए नहीं है, Assert

+1

+1 अच्छी तरह से कहा गया। यदि अप्रत्याशित मूल्य आपके स्वयं से आता है, तो सम्मिलित करें और असफल हो जाएं। दूसरी तरफ, यदि यह आपके कोड का उपयोग कर किसी और से आता है तो आपको अपवाद फेंकना चाहिए और कॉलिंग कोड को पुनर्प्राप्त करने का मौका देना चाहिए। –

+2

जोर से फेंकने से बेहतर क्यों है? हो सकता है कि यह स्थिति एक दुर्लभ मामला है और डेवलपर इसे हिट नहीं करता है, और यह केवल परीक्षक द्वारा मारा जाता है, जो रिलीज बिल्ड का उपयोग करता है (इसमें कोई आर्ट संकलित नहीं होता है) और त्रुटि निगल जाती है। क्या त्रुटियों को निगलना बेहतर है, क्रैश न करें, लेकिन स्टैक ट्रेस के साथ दुर्घटनाग्रस्त होने की बजाय गलत चीज़ को डीबग करना मुश्किल है? –

+0

एक और सवाल यह है कि यदि आप अन्य कंपनियों के लिए एपीआई नहीं लिखते हैं तो कोड में कितना त्रुटि जांच करना उचित है? शॉर्ट कोड मुझे लगता है कि कोड की तुलना में अधिक पठनीय है जिसमें त्रुटि जांच के कारण प्रत्येक विधि का आकार दोगुना हो जाता है। यही है ना ? –

0

यह वास्तव में विशिष्ट प्रक्रिया पर निर्भर करता है, लेकिन हां, डिफ़ॉल्ट में प्रतिक्रिया देने की अच्छी प्रक्रिया है: अगर कुछ ऐसा नहीं होना चाहिए था।

2

यह एक उचित विकल्प की तरह लगता है।

व्यक्तिगत रूप से, मैं एक नया प्रकार का अपवाद (शायद InvalidEnumException बनाउंगा या इसे एक और नाम दूंगा जो समर्थन टीम को समझ में आएगा) और इसे फेंक दें।

+2

मैं व्यक्तिगत अपवाद प्रकारों के असंख्य में से एक को व्यक्तिगत रूप से कोशिश और पुन: उपयोग करता हूं। http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – Joe

+0

सहमत, डाउनवॉटेड क्योंकि मुझे नहीं लगता कि यह एक मामला है एक कस्टम अपवाद प्रकार। –

1

मैं ApplicationException फेंक दूंगा क्योंकि यदि आपका कोड डिफ़ॉल्ट तक पहुंचता है और आपको इसकी उम्मीद नहीं होती है तो इसका मतलब है कि आपके कोड में कुछ ऐसा व्यवहार नहीं कर रहा है जहां आप सोच रहे हैं।

+0

आवेदन अपवाद का उपयोग नहीं किया गया है? –

+0

मैंने कभी नहीं सुना है कि –

0

मैं कहूंगा कि कम से कम आपको Debug.Fail() डालना चाहिए।

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

4

शायद नहीं कार्यान्वित अपवाद, लेकिन ArgumentException। यह वास्तव में इस बात पर निर्भर करेगा कि आप इसका उपयोग कहां कर रहे हैं।

1

यह वास्तव में आपके उपयोग के मामले पर निर्भर करता है। यदि आप एकीकरण के प्रारंभिक दिनों के दौरान अपवाद फेंकते हैं तो यह सहायक होगा। आपकी लाइब्रेरी के उपयोगकर्ता तुरंत त्रुटियों को जानने के लिए आ सकते हैं

0

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

0

आपको सबसे पहले यह समझना चाहिए कि अगर आपको ज्ञात मामलों के बाहर कोई मूल्य मिल गया है तो इसका क्या अर्थ होगा- परिवर्तनीय को प्रतिनिधित्व पर स्विच किया जा रहा है? फिर आप बस एक अपवाद प्रकार का उपयोग कर सकते हैं जो वास्तव में क्या हो रहा है।

5

यह वास्तव में निर्भर करता है।

  • NotImplementedException मेरे लिए कुछ भी पसंद है। इसका मतलब है कि कोई कोड कोड खत्म करने के बाद बाद में आएगा। हालांकि मुझे नहीं लगता कि यह डिफ़ॉल्ट मामला है जो नहीं होना चाहिए।

  • जब आप ऑब्जेक्ट की स्थिति की जांच कर रहे हैं तो आप InvalidOperationException पर विचार कर सकते हैं। आपकी विधि केवल मौजूदा मामलों के साथ काम करने के लिए डिज़ाइन की गई है।

  • जब आप इनपुट पैरामीटर ArgumentException पर भेदभाव करते हैं तो हमेशा उपयुक्त होता है।

  • अन्य मामलों में मैं NotSupportedException पसंद करता हूं। यह थोड़ा इंगित करता है कि मंच या संस्करण के साथ कुछ गलत है। और कोड के असंगत संस्करण समस्या की वास्तविक जड़ है जब स्विच का डिफ़ॉल्ट मामला नहीं होना चाहिए।

+0

दिलचस्प जवाब। आपकी प्रेरणा/तर्क क्या है? –

+1

@Tim: मैंने अपना जवाब अपडेट किया। –

+0

उत्कृष्ट उत्तर, अद्यतन करने के लिए धन्यवाद। मैं पूरी तरह से आपसे सहमत हूं कि आपने इसे कैसे रखा है। इससे मुझे सीधे अपने सिर में लाने में मदद मिली है। –

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