2009-02-06 13 views
9

मैं अगर एक संपत्ति bool मूल्य के लिए ठीक से स्थापित किया गया है कि यह इस तरह होना चाहिए खोजने एक कोशिश पकड़ में वर्तमान में हूँ ...सी # मुझे किस प्रकार का अपवाद उठाना चाहिए?

public void RunBusinessRule(MyCustomType customType) 
{ 
    try 
    { 
     if (customType.CustomBoolProperty == true) 
     { 
      DoSomething(); 
     } 
     else 
     { 
      throw new Exception("This is obviously false or possibly null lets throw up an error."); 
     } 
    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 

अब मेरे लिए यह त्रुटि फेंक के साथ सौदा है कि मैं कर रहा हूँ माइक्रोसॉफ्ट के स्रोत विश्लेषण का उपयोग करके और यह मुझे एक त्रुटि देता है "CA2201: Microsoft.Usage: Object.RunBusinessRule (MyCustomType) प्रकार 'अपवाद' का अपवाद बनाता है, एक अपवाद प्रकार जो पर्याप्त रूप से विशिष्ट नहीं है और इसे कभी भी उपयोगकर्ता कोड द्वारा उठाया नहीं जाना चाहिए। यदि यह अपवाद उदाहरण फेंक दिया जा सकता है, तो एक अलग अपवाद प्रकार का उपयोग करें।

Soooo मुझे क्या अपवाद करना चाहिए जो माइक्रोसॉफ्ट के लिए पर्याप्त विशिष्ट होगा .., मेरे अपने आवेदन के तर्क प्रबंधन के बारे में एक त्रुटि फेंकने की स्थिति के लिए और जब मैं "फेंकना" चाहता हूं।

उत्तर

15
ArgumentException 
InvalidOperationException 
FormatException 

उत्तीर्ण तर्क अच्छा नहीं था।

+0

:

मैं एक bool प्रकार के रूप में अपने विधि का परिणाम वापस जाने के लिए तो आप विधि बुला के समय में उपयोगकर्ता के लिए एक त्रुटि संदेश दिखाने के लिए उचित तरीके से तय कर सकते हैं अपने विधि को संशोधित करने के लिए सुझाव 'InvalidOperationException' है *" अपवाद जो फेंक दिया जाता है जब किसी ऑब्जेक्ट की वर्तमान स्थिति के लिए विधि कॉल अमान्य है। "*, यानी कक्षा फ़ील्ड, पैरामीटर नहीं। – brianary

13

क्या आप बिल्कुल अपवाद फेंक रहे हैं?

झूठी बूलियन मान होने के कारण बिल्कुल असाधारण परिस्थिति नहीं है।

संपादित

मेरे मूल जवाब थोड़ा संक्षिप्त तो मैं विस्तार से बता देंगे ...

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

जैसे, मैं एक अपवाद की एक पूरी तरह से वैध उपयोग निम्नलिखित पर विचार चाहते हैं (और अपने वास्तविक कोड में अच्छी तरह से कुछ इस तरह लग सकता है, लेकिन हम अपने उदाहरण से नहीं बता सकता):

public void UpdateMyCustomType(MyCustomType customType) 
{ 
    if (!customType.IsUpdateable) 
     throw new InvalidOperationException("Object is not updateable."); 

    // customType is updateable, so let's update it 
} 

लेकिन सामान्य स्थिति में, आपके डोमेन मॉडल के बारे में और जानने के बिना, मैं कहूंगा कि ऐसा कुछ (एक झूठा बूलियन मान) वास्तव में असाधारण नहीं है।

1

एक तरफ एक मामूली, लेकिन आप अपने कोड कुछ हद तक आसान बनाने में कर सकता है ...

public void RunBusinessRule(MyCustomType customType) 
{ 
    if (customType.CustomBoolProperty == false) 
    { 
     throw new Exception("This is obviously false or possibly null lets throw up an error."); 
    } 

    DoSomething(); 
} 

अपवाद फेंक के प्रकार के लिए के रूप में, आप ApplicationException या InvalidOperationException पर विचार हो सकता है, या आप अपने खुद के अपवाद के प्रकार को परिभाषित कर सकते हैं।

+0

व्यक्तिगत, इस तरह की सरलीकरण हमेशा मुझे परेशान करता है। जहां तक ​​पठनीयता बढ़ जाती है, मुझे लगता है कि अगर आप कह रहे हैं "केवल यह करें कि अगर बूल सत्य है तो" यह if/then कथन का हिस्सा होना चाहिए। यह सिर्फ मेरी व्यक्तिगत राय है, लेकिन मैं हमेशा निहित से स्पष्ट दिखता हूं। –

12

Exception का विस्तार करने का अपना अपवाद बनाएं। उदा .: RuleViolationException

0

सिस्टम का विस्तार करके अपना स्वयं का कस्टम अपवाद बनाएं। अपवाद और इसे फेंक दें। यदि आप चाहें तो आप भी पागल हो सकते हैं और अपवाद प्रकारों का पूरा पेड़ प्राप्त कर सकते हैं।

0

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

1

मैं जानता हूँ कि एक सवाल एक अपवाद फेंकने के बारे में है कि लेकिन मुझे लगता है कि यहाँ एक assertation करने के लिए अधिक उपयुक्त होगा:

// Precondition: customType.CustomBoolProperty == true 
System.Diagnostics.Debug.Assert(customType.CustomBoolProperty) 
DoSomething(); 
1

InvalidArgument अपवाद बेहतर अभी तक, एक ApplicationException ठीक लेकिन है।

+1

माइक्रोसॉफ्ट एप्लिकेशन अपवाद की सिफारिश करता था, लेकिन अब और नहीं - अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/seyhszts.aspx देखें। – LukeH

+0

वास्तव में, वह पोस्ट कहती है कि एप्लिकेशन अपवाद से प्राप्त अपने स्वयं के अपवाद नहीं बनाना; यह अनुप्रयोग अपवाद को फेंकने के लिए नहीं कहता है। – ALEXintlsos

+3

[संपादित करें], विजुअल स्टूडियो कोड विश्लेषण का कहना है कि एप्लीकेशन अपवाद "पर्याप्त रूप से विशिष्ट नहीं है और उपयोगकर्ता कोड द्वारा कभी नहीं उठाया जाना चाहिए" । – ALEXintlsos

2

यहां जवाब यह है कि आपको कोई अपवाद नहीं फेंकना चाहिए। एक अपवाद को फिर से पकड़ने के लिए एक अपवाद क्यों फेंक दो और इसे फिर से डालें?

0

वास्तव में आप जो भी पूछ रहे थे, वास्तव में नहीं हैं, लेकिन ऐसे बहुत से लोग हैं जिन्होंने पहले ही उत्तर दिए हैं जिनसे मैं सहमत हूं, लेकिन आपको केवल पकड़ (अपवाद पूर्व) का उपयोग करना चाहिए।

यह विशिष्ट अपवादों को पकड़ने की कोशिश करने के लिए एक बेहतर अभ्यास है जो पहले संभव है और यदि आवश्यकता हो, तो सामान्य अपवाद को पकड़ें। उदाहरण के लिए:

try{ 
    MyMethod(obj); 
}catch (NullReferenceException ne){ 
    //do something 
} 
catch(UnauthorizedAccessException uae){ 
    //do something else 
} 
catch(System.IO.IOException ioe){ 
    //do something else 
} 
catch(Exception){ 
    //do something else 
} 
+0

वह इस कोड के साथ CA2201 भी प्राप्त करेगा क्योंकि NullReferenceException और लीट पर अपवाद रनटाइम की तुलना में किसी अन्य चीज़ द्वारा उपयोग नहीं किया जाना चाहिए। सबूतों का समर्थन करने और अच्छे सिद्धांत का उपयोग करने के लिए – Louhike

1

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

public void RunBusinessRule(MyInheritedType inheritedObject) 
{ 
    //No need for checks, this is always the right type. 
    //As a matter of fact, RunBusinessRule might even belong to MyInheritedType. 
} 

यह मैं SOLID में हूं।

+0

+1 –

1

मुझे लगता है कि आपको कोड तर्क के लिए अपवादों से बचना चाहिए।

public bool RunBusinessRule(MyCustomType customType) 
{ 
    try 
    { 
     if (customType.CustomBoolProperty == true) 
     { 
      DoSomething(); 
      return true; 
     } 

     return false; 
    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 
संबंधित मुद्दे