2011-09-26 25 views
20

मैं कुछ कोड देख रहा हूं और मुझे e.ToString() मिला और मैं सोच रहा था कि इसके बजाय ToString() विधि का उपयोग करने में कोई अंतर है या नहीं।अपवाद के .TOString() और मैसेज के बीच क्या अंतर है?

नीचे पढ़ना, ऐसा लगता है जैसे यह अधिक जानकारी देता है।

From Microsoft's Docs

ToString NET कम्पैक्ट फ्रेमवर्क द्वारा समर्थित। ओवरराइड। मौजूदा अपवाद का एक स्ट्रिंग प्रतिनिधित्व बनाता है और देता है।

संदेश .NET कॉम्पैक्ट फ्रेमवर्क द्वारा समर्थित। एक संदेश प्राप्त करता है जो वर्तमान अपवाद का वर्णन करता है।

+7

मुझे लगता है कि आप अपने खुद के सवाल का जवाब दे –

+0

अपवाद है एक ऑब्जेक्ट, उस पर ToString का उपयोग करके, ऑब्जेक्ट को एक स्ट्रिंग में परिवर्तित करता है (जो एक ऑब्जेक्ट है) तो यह संभवतः नेमस्पेस के बराबर होगा। अपवाद। –

+3

@ रामहाउंड: 'अपवाद' 'ToString' को ओवरराइड करता है। – SLaks

उत्तर

18

आप एक ही बार में जितना संभव हो उतना जानकारी पाने के लिए देख रहे हैं, कहते हैं ToString():

ToString के डिफ़ॉल्ट कार्यान्वयन वर्ग है कि मौजूदा अपवाद फेंक दिया, संदेश के नाम पर प्राप्त(मेरा जोर), आंतरिक अपवाद पर ToString को कॉल करने का परिणाम, और पर्यावरण कॉल करने का परिणाम। StackTrace। यदि इनमें से कोई भी सदस्य कुछ भी नहीं है, तो इसका मान लौटाई गई स्ट्रिंग में शामिल नहीं है।

यह सुविधाजनक आप अपने आप को एक साथ सभी अलग-अलग तत्वों संलग्न करने के लिए की जरूरत नहीं है कि, सुनिश्चित करें कि कोई भी, अशक्त हैं आदि यह सब में ...

Exception.ToString Method

बनाया गया है बनाने के लिए जाँच है आप reference.microsoft.com पर वास्तविक स्रोत कोड भी देख सकते हैं।

0

ToString विधियां Message संपत्ति पर लौटती हैं जहां त्रुटि हुई है, इस बारे में जानकारी के साथ।

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

यदि आप डीबग मोड में चल रहे हैं, तो त्रुटि रिपोर्ट में अधिक विस्तृत जानकारी होती है, उदा। कॉल स्टैक में लाइन नंबर।

5

ToString()StackTrace के साथ Message लौटाता है।
ToString() में भी InnerException एस शामिल होगा।

ToString() त्रुटियों को ट्रैक करते समय Message से अधिक उपयोगी है जो बहुत अधिक स्ट्रिंग देता है।

2

तुम हमेशा बस कोशिश करते हैं और देख सकते हैं:

try 
{ 
    throw new Exception("This is a test."); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex); 
    Console.WriteLine(ex.Message); 
} 

(आपको लगता है कि आप सही हैं मिलेगा, .ToString अन्य बातों के अलावा स्टैक ट्रेस सहित अधिक सूचनात्मक है,

+4

आपको इसके बजाय इस कैच ब्लॉक का उपयोग करना चाहिए:' पकड़ें (अपवाद पूर्व) { कंसोल। राइटलाइन (" #### टॉस्ट्रिंग का परिणाम ###### "); कंसोल। राइटलाइन (पूर्व); Console.WriteLine(); कंसोल। राइटलाइन ("#### संदेश का परिणाम ######"); कंसोल। राइटलाइन (उदा। संदेश); } '। इससे ओपी दोनों के आउटपुट को अलग करने में मदद मिलेगी –

0

ई।।ToString() आपको प्रिंटट्रेस जैसे विस्तृत संदेश देगा, मुझे लगता है कि कौन सा प्रदर्शन अपवाद नाम और रेखा है जहां अपवाद को फेंक दिया गया था जहां e.Message आउटपुट केवल एक विशिष्टता के बिना एक पठनीय संदेश है।

आप अपवाद आधार निर्माता जांच कर सकते हैं

12

नेट परावर्तक या इसी तरह का उपयोग कर देखने के लिए क्या System.Exception पर ToString विधि क्या कर रहा है का प्रयास करें:

[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] 
public override string ToString() 
{ 
    return this.ToString(true); 
} 

private string ToString(bool needFileLineInfo) 
{ 
    string className; 
    string message = this.Message; 
    if ((message == null) || (message.Length <= 0)) 
    { 
     className = this.GetClassName(); 
    } 
    else 
    { 
     className = this.GetClassName() + ": " + message; 
    } 
    if (this._innerException != null) 
    { 
     className = className + " ---> " + this._innerException.ToString(needFileLineInfo) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack"); 
    } 
    string stackTrace = this.GetStackTrace(needFileLineInfo); 
    if (stackTrace != null) 
    { 
     className = className + Environment.NewLine + stackTrace; 
    } 
    return className; 
} 
संबंधित मुद्दे