2010-05-17 10 views
7

अगर मैं एक नियमित है कि, जैसे दो स्थानों पर एक ArgumentException फेंक कर सकते हैं कुछ है ...दो अपवादों में से कौन सा कहा जाता था?

if (Var1 == null) 
{ 
    throw new ArgumentException ("Var1 is null, this cannot be!"); 
} 

if (Val2 == null) 
{ 
    throw new ArgumentException ("Var2 is null, this cannot be either!"); 
} 

मेरी बुला प्रक्रिया दो अपवाद के, जिसमें निर्धारित करने का सबसे अच्छा तरीका क्या है फेंक दिया गया था?

या

क्या मैं इसे गलत तरीके से कर रहा हूं?

उत्तर

11

ArgumentException निर्माता के दूसरे तर्क में चर (Val1, Val2 आदि) का नाम पास करें। यह ArgumentException.ParamName संपत्ति बन जाता है।

4

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

+0

+1 इसके अलावा विधि को कॉल करने से पहले आसानी से जांच की जा सकती है। – Skurmedel

+0

लेकिन अगर मैं उपयोगकर्ता को एक विशिष्ट संदेश को विस्थापित करना चाहता था, तो दो अपवादों में से किस पर फेंक दिया गया था? – Rob

+0

आप या तो अपवाद से टेक्स्ट का उपयोग कर सकते हैं, या इसके बजाए 'ArgumentNullException' फेंक सकते हैं। –

12

इस विशिष्ट परिदृश्य के लिए आपको ArgumentNullException का उपयोग करना चाहिए और इसे ParamName संपत्ति को सही ढंग से भरना चाहिए ताकि आप उस तर्क को जान सकें जो शून्य है।

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

इन प्रकार के अपवादों का उपयोग करते समय भी कन्स्ट्रक्टर का उपयोग करते समय सावधान रहें जो संदेश और पैरामीटर नाम दोनों को स्वीकार करते हैं। आदेश प्रत्येक अपवाद प्रकार के बीच स्विच कर रहे हैं:

throw new ArgumentException("message", "paramName"); 

throw new ArgumentNullException("paramName", "message"); 
0
try 
     { 
      //code here 
     } 
     catch (ArgumentException ae) 
     { 
      Console.WriteLine(ae.ToString()); 
     } 

अपने कंसोल संदेश आप डाल दिया बताएगा में उत्पादन।

3

परिभाषित करने के लिए निर्माता ArgumentException(string, string) का उपयोग करें, कौन सा पैरामीटर शून्य था।

if (Var1 == null) { 
    throw new ArgumentException ("Var1 is null, this cannot be!","Var1"); 
} 

if (Val2 == null){ 
    throw new ArgumentException ("Var2 is null, this cannot be either!","Var2"); 
} 
2

ठीक है, विशेष रूप से एक ArgumentException के लिए आप एक पैरामीटर है जिसके लिए तर्क एक समस्या थी हैं:

throw new ArgumentException("Var1 is null, this cannot be!", "Var1"); 

एक अधिक सामान्य अर्थ में, आप आमतौर पर उपयोग की तरह कुछ अलग (संभवतः कस्टम) करना होगा अपवाद प्रकार, और फिर कॉलिंग कोड में विभिन्न पकड़ ब्लॉक हो सकते हैं

public class MyCustomException1 : ApplicationException {} 
public class MyCustomException2 : ApplicationException {} 


try 
{ 
DoSomething(); 
} 
catch(MyCustomException1 mce1) 
{ 
} 
catch(MyCustomException2 mce2) 
{ 
} 
catch(Exception ex) 
{ 
} 
+0

इस स्थिति में ArgumentException के लिए दूसरा तर्क एक स्ट्रिंग होना चाहिए, यानी, अपमानजनक पैरामीटर का नाम होना चाहिए। – Polyfun

+0

वूप्स ... बेशक आप सही हैं – Clyde

3

बड़ा सवाल आपको खुद से पूछना चाहिए क्यों? यदि आप इस तरह के कुछ प्रकार के तर्क को चलाने की कोशिश कर रहे हैं, तो अपवाद आमतौर पर जाने का एक बुरा तरीका है।

इसके बजाय, आपके पास एक रिटर्न टाइप (या आउट/रेफ पैरामीटर) होना चाहिए जो किसी प्रकार के फ्लैग/वैल्यू के साथ सेट किया जाएगा जिसे आप कॉलिंग कोड से पहचान सकते हैं यह निर्धारित करने के लिए कि त्रुटि क्या है और अपना तर्क बंद करें उस।

यदि आप अपवादों का उपयोग करने पर जोर देते हैं, तो इस मामले में, ArgumentNullException has a constructor that takes the name of the parameter and the exception message। आप अपवाद फेंक सकते हैं और फिर जब आप अपवाद को पकड़ते हैं, तो अपवाद के कारण पैरामीटर का नाम निर्धारित करने के लिए ParamName property तक पहुंचें।

0

ArgumentExceptions फेंकते समय आप हमेशा अपवाद के कारण तर्क का नाम शामिल कर सकते हैं (यह another constructor है)।बेशक मुझे लगता है कि आप वास्तव में जानना चाहते हैं कि कौन सा शून्य था और उस स्थिति में, आपको शायद ArgumentNullException का उपयोग करना चाहिए।

0

यदि यह एक परीक्षण केस के लिए है जहां आप यह सुनिश्चित करना चाहते हैं कि सही अपवाद संदेश प्रदर्शित किया जा रहा है, तो मुझे पता है कि न्यूटिट के पास ExpectedMessage कीवर्ड ExpectedException विशेषता है। अन्यथा, ArgumentNullException एक ArgumentNullException है और आपके आवेदन को उन सभी के साथ व्यवहार करना चाहिए। यदि आप अधिक जानकारी चाहते हैं, तो अपनी अपवाद कक्षाएं बनाएं और उनका उपयोग करें।

तो आप निम्नलिखित के लिए परीक्षण कर सकते हैं:

[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Var1 is null, this cannot be!"] 
public void TestCaseOne { 
    ... 
} 

[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Var2 is null, this cannot be either!"] 
public void TestCaseTwo { 
    ... 
} 
3

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

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

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

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