2010-06-03 10 views
5

यहां एक सामान्य कार्य है जो या तो सत्य/झूठा लौटाता है;सी # सामान्य रिटर्न प्रकार होने के लिए संभव है?

private static bool hasValue() 
{ 
    return true; 
} 

अब एक त्रुटि पर, मैं परिभाषा के साथ अपने स्वयं के कस्टम त्रुटि वस्तु लौटने के लिए करना चाहते हैं:

public class Failure 
    { 
     public string FailureDateTime { get; set; } 
     public string FailureReason { get; set; } 
    } 

मैं उदाहरण के लिए इस कस्टम वस्तु फेंक करने में सक्षम होने की उम्मीद है | ...

private static bool hasValue() 
{ 
    try 
     { 
      ...do something 
     } 
    catch 
     { 
     throw new Failure(); 
     } 
    return true; 
} 

यह संभव नहीं है, और मैं क्योंकि मैं व्यक्तिगत रूप से सी # में अपवाद serializing समस्याएं थीं (यह .net v2 के साथ किया गया था) है System.IO.Exception से विफलता प्राप्त करने के लिए नहीं करना चाहती।

इस समस्या का सबसे अच्छा अभ्यास/या आदर्श समाधान क्या है। क्या मुझे निजी स्थैतिक वस्तु के साथ काम करना चाहिए? या क्या कोई कस्टम ऑब्जेक्ट वापस करने के लिए क्लीनर तरीका है या सामान्य रिटर्न प्रकार को एक त्रुटि पर बाईपास करें (System.IO.Exception का उपयोग नहीं कर रहा है)?

मैं ऑब्जेक्ट का उपयोग करने के बारे में पूरी तरह से जंगली नहीं हूं, क्योंकि तब मुझे कास्टिंग और अधिक बूलियन का उपयोग करके परिणाम को सत्यापित करने की आवश्यकता है।

+0

मुझे लगता है कि केवल एक चीज जिसे फेंक दिया जा सकता है वह अपवाद से निकला है। – kenny

उत्तर

10

समाधान इस तरह की इस मामले को फिट हो सकता है:

var exception = new Exception(); 
exception.Data.Add("Failure", new Failure()); 
throw exception; 

आप अपवाद (अपने स्वयं के अपवाद प्रकार को परिभाषित करने की सिफारिश की) फेंक कर सकते हैं और डेटा शब्दकोश का उपयोग विफलता धारण करने के लिए। catch कोड में आप डेटा ले सकते हैं और इसे क्रमबद्ध कर सकते हैं। यदि आप अपना अपवाद प्रकार बनाते हैं तो आप किसी संपत्ति पर विफलता डाल सकते हैं।

टिप्पणी: मैंने इसे जांच नहीं लिया, लेकिन क्या आप निश्चित हैं कि अपवाद क्रमिक नहीं हैं?

+1

+1 यह बहुत प्यारा है। –

+0

मुझे लगता है कि मैं इस समाधान को लागू करूंगा, बहुत आशाजनक दिखता है। –

+0

मुझे अभ्यास में अपवादों को क्रमबद्ध करने में कुछ समस्याएं आई हैं। –

7

मैं सी # में अपवाद को क्रमबद्ध करने में असमर्थता के कारण System.IO.Exception से विफलता प्राप्त नहीं करना चाहता हूं।

यह प्रश्न इस बात पर आधारित है कि आप IOException से प्राप्त अपवादों को क्रमबद्ध नहीं कर सकते हैं। हालांकि मैं इस धारणा को चुनौती देना चाहता हूं। IOException को Serializable के रूप में चिह्नित किया गया है। आपको बस इतना करना है कि आप अपने सबक्लास को क्रमिक के रूप में चिह्नित करें।

IOException के लिए दस्तावेज़ देखें:

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public class IOException : SystemException 
6

आप System.Exception (या इसके किसी भी अन्य गैर sealed उपवर्ग) से प्राप्त करने के आप अपने खुद के अपवाद वर्ग बनाना चाहते हैं की जरूरत है। धारावाहिक करने में विफलता कि आप किस बारे में बात कर रहे हैं, यह तथ्य है कि आपने धारावाहिक कन्स्ट्रक्टर को लागू नहीं किया है।

विजुअल स्टूडियो में एक कोड स्निपेट है जो उप-वर्गीकरण अपवाद के लिए एक अनुशंसित टेम्पलेट बनाता है। आप इसे exception टाइप करके और टैब दो बार दबाकर प्राप्त कर सकते हैं।

यह वही बाहर आता है:

[Serializable] 
public class MyException : Exception { 
    public MyException() { } 
    public MyException(string message) : base(message) { } 
    public MyException(string message, Exception inner) : base(message, inner) { } 
    protected MyException(
     System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) 
     : base(info, context) { } 
} 
0

स्थिति इस तरह का बारे में बहुत ज्यादा चिंता मत करो; बस इस तर्क को समाहित करने के लिए परिणाम प्रकार बनाएं।

public class ValueResult 
{ 
    public Failure FailureDetails {get;set;} 
    public bool Success {get;set;} 
    public bool HasValue {get;set;} 
    public object Value {get;set;} 
} 

और

अपवाद से
var result = HasValue(); 
if(result.Success) 
    DoSomething(result.Value); 
else if(!result.Success) 
    LogFailure(result.FailureDetails); 
+1

... और आपको सी स्टाइल त्रुटि कोड के साथ प्रोग्रामिंग की सभी लालित्य और मजबूती मिलती है ... आप कॉलर के कॉलर्स को कैसे जानते हैं और त्रुटि से निपटने देते हैं? –

+0

कम से कम इसे सामान्य वस्तु का उपयोग करने के बजाय सामान्य बनाएं। – harms

+0

@harms वैल्यू वह जो भी चाहता है वह है; समाधान किसी भी परिस्थिति में उपयोग करने के लिए एक सामान्य वर्ग नहीं है (अपवाद हैंडलिंग को बदलने की कोई आवश्यकता नहीं है), उसके quesiton के लिए बस एक और विकल्प है। तो यदि मूल्य एक मिनीग्रीन चॉकलेट होना चाहिए तो वह ऑब्जेक्ट के लिए इसे बस बाहर कर सकता है। – Will

1

Inerit और तुम एक वर्ग है कि इस तरह अपवाद से इनहेरिट करना है अपने ऑब्जेक्ट serializable

0

बनाने:

[Serializable] 
public class Failure: Exception 
{ 
    public string ErrorMessage 
    { 
     get 
     { 
     return base.Message.ToString(); 
     } 
    } 

} 

और फिर

catch(Exception ex) 
{ 
    throw new Failure(
      "exception message here", ex.messege); 
} 
0

इसके अलावा, आप हमेशा कस्टम अपवाद अपवाद संचालन के लिए अपने स्वयं के वर्ग उपलब्ध कराने के प्रकार स्वरूपण, प्रवेश करने आदि के लिए उद्यम लाइब्रेरी एक्सेप्शन हैंडलिंग उपयोग कर सकते हैं ...

try 
{ 
} 
catch(Exception ex) 
{ 
    bool rethrow = ExceptionPolicy.HandleException(ex, "My Custom Policy"); 
    if (rethrow) 
    { 
     throw; 
    } 
} 
finally 
{ 
} 

उदाहरण:

http://weblogs.asp.net/sukumarraju/archive/2009/10/04/microsoft-enterprise-library-4-1-exception-handling-block.aspx

http://www.imason.com/imason_Blogs/b/suleman_ibrahim/archive/2009/05/25/configuring-enterprise-library-4-0-for-exception-handling-and-logging.aspx

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