2009-06-22 11 views
5

में चाहिए Guid.Empty परिणाम कल्पना कीजिए कि आप निम्नलिखित हस्ताक्षर के साथ एक विधि है:ArgumentException या ArgumentOutOfRangeException

public void DoSomething(Guid id) 

तो Guid.Emtpy एक अवैध मूल्य है, जो अपवाद प्रकार यह सबसे फेंकने के लिए उपयुक्त होगा का प्रतिनिधित्व करता है? ArgumentException या ArgumentOutOfRangeException?

मैं ArgumentException की ओर थोड़ा झुकाव रहा हूँ, क्योंकि मुझे नहीं लगता कि Guid.Empty को छोड़कर सभी GUIDs एक श्रृंखला के लिए बहुत कुछ है - यह एक सा भी समावेशी है: केवल एक ही बाहर रखा सदस्य है।

हालांकि, मैं कोई रास्ता नहीं निर्धारित किया है कि इस मामले होना चाहिए में हूँ, इसलिए मैं अगर कोई एक या दूसरे के लिए तर्क प्रदान कर सकते हैं सुनना चाहते हैं?

मुझे अच्छी तरह पता है कि यह मुख्य रूप से एक अर्थ चर्चा है हूँ, लेकिन अच्छा एपीआई डिजाइन के हित में मैं अभी भी पता करने के लिए एक या अन्य विकल्प के लिए स्पष्ट मामलों देखते हैं कि क्या करना चाहते हैं।

+0

यह लगभग आपकी विधि को कुछ प्रकार की अच्छी मार्गदर्शिका मार्गदर्शिका की आवश्यकता है। –

+0

शायद अपने खुद के ArgumentEmptyException परिभाषित करें? – yfeldblum

+0

@ जस्टिस। एक परिदृश्य के लिए एक नया अपवाद प्रकार जोड़ना जहां आप कभी इसे पकड़ना नहीं चाहते हैं, सलाह नहीं दी जाती है। मार्क को मौजूदा अपवाद प्रकारों में से एक को फेंक देना चाहिए। – Steven

उत्तर

5

यह कहकर कि खाली मूल्य सीमा से बाहर है, बस गलत लगता है। Guid.Empty आमतौर पर तब प्रयोग किया जाता है जब कोई परिभाषित मूल्य नहीं होता है, वास्तव में कोई भी मूल्य नहीं है जो सीमा के बाहर हो सकता है।

स्थिति है जब आप, ArgumentNullException का उपयोग को छोड़कर वहाँ खाली मूल्यों के लिए कोई विशेष अपवाद नहीं है के समान है। एक ArgumentNullException भ्रामक होगा, इसलिए ArgumentException एक बेहतर फिट है।

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

+1

एप्लिकेशन अपवाद थोड़ा अनावश्यक है और शायद सबसे अच्छा बचा है (http://stackoverflow.com/questions/52753/derive-from- अपवाद या applicationexception-इन-नेट)। – adrianbanks

+0

@adrianbansk: यह अपवाद कक्षाओं से प्राप्त करने के बारे में है, जो केवल मुश्किल से संबंधित है। यदि आप किसी विशिष्ट सिस्टम अपवाद का उपयोग नहीं करना चाहते हैं ताकि आप इसे अन्य सिस्टम अपवादों के साथ पकड़ सकें, तो एप्लिकेशन अपवाद केवल ठीक काम करता है। – Guffa

+1

हाँ, मुझे पता है। जो मैं प्राप्त कर रहा था वह यह है कि अगर एप्लिकेशन अपवाद को "नेट फ्रेमवर्क का हिस्सा नहीं होना चाहिए" तो इसका उपयोग भविष्य में बहिष्कृत किया जा सकता है। अधिक प्रासंगिक ArgumentException के लिए अब इसका उपयोग टालना इस समस्या से बाद में बच जाएगा। – adrianbanks

1

Invalid ArgumentException फेंको। यह वास्तव में आप के बाद के अर्थशास्त्र का पालन करता है। यदि आप uint की अपेक्षा करते हैं और 0xffffffff को छोड़कर सभी मान मान्य हैं, तो आप ArgumentOutOfRangeException फेंक नहीं देंगे, क्या आप?

+3

अमान्य अर्ग्यूमेंट अपवाद Microsoft.SqlServer.Management.Common नेमस्पेस का हिस्सा है। आप उस अपवाद तक पहुंच प्राप्त करने के लिए केवल एक संदर्भ जोड़ना नहीं चाहते हैं। इसके बजाय ArgumentException का उपयोग करें, जो सिस्टम नेमस्पेस में है। – Guffa

+0

आप बिल्कुल सही हैं। मैं सिर्फ शपथ ले सकता था कि मैंने सीधे बीसीएल कोड में कुछ अमान्य अर्ग्यूमेंट अपवाद देखा, क्योंकि मैंने कभी भी SQL सर्वर का उपयोग नहीं किया ... – OregonGhost

7

मैं एक ArgumentException फेंक चाहते हैं। इसका docs कहता है:

एक अपवाद जो किसी विधि को प्रदान किए गए तर्कों में से एक वैध नहीं है, तो अपवाद है।

जो वास्तव में परिदृश्य आप का वर्णन है। आप कुछ के साथ कुछ चाहते हैं:

throw new ArgumentException("Guid.Empty is not a valid id", "id");
0

एई।

वास्तव में GUIDs की स्वीकार्य सीमा अपने विधि उम्मीद कर रही है क्या है?

स्वीकार्य सीमा के भीतर CA72EE5A-5F26-11DE-BD28-13A156D89593 है, लेकिन D58B3112-5F26-11DE-B0D2-5FA156D89593 सही है?

+0

मुझे लगता है कि स्वीकार्य सीमा 00000000-0000-0000-0000-000000000001 FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF तक है। इसलिए, मुझे लगता है कि हम निष्कर्ष निकाल सकते हैं कि मार्क को एक ArgumentOutOfRangeException फेंकना चाहिए, क्योंकि केवल एक ही मान है जो अमान्य है। उसे एक अवैध SingleArgumentValueException फेंक देना चाहिए, लेकिन क्योंकि यह अपवाद मौजूद नहीं है, मैं ArgumentException के लिए जाना होगा :-) – Steven

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