2011-09-26 83 views
20

我正在查看一些代碼,我發現e.ToString(),我想知道是否有區別使用ToString()方法,而不是.Message?Exception的.ToString()和.Message之間的區別是什麼?

閱讀下面,它聽起來像它會返回更多信息。

From Microsoft's Docs

的ToString 由.NET Compact Framework提供支持。 覆蓋。創建並返回當前異常的字符串表示形式。

消息 受.NET Compact Framework支持。 獲取描述當前異常的消息。

+7

我想你回答了你自己的問題 –

+0

的例外是一個使用ToString的對象將對象轉換爲一個String(它是一個對象),所以它可能簡單地等於Namespace.Exception。 –

+3

@Ramhound:'Exception'覆蓋'ToString'。 – SLaks

回答

18

如果你希望得到儘可能多的信息可能在一氣呵成,叫ToString()

的ToString的默認實現獲取拋出當前異常的類,消息的名稱(我的強調),對內部異常調用ToString的結果,以及調用Environment.StackTrace的結果。如果這些成員中的任何一個都是Nothing,則其值不會包含在返回的字符串中。

它的方便,你不必所有的單個元素追加自己一起,檢查,以確保沒有一個是空,等這一切都建立在...

Exception.ToString Method

你也可以在reference.microsoft.com查看實際的源代碼。

0

ToString方法返回Message屬性以及錯誤發生位置的信息。

Message屬性旨在用於對錯誤的簡短描述,並且只包含執行Exception的人員放置在那裏的內容。來自ToString的resport包含總是包含的附加信息。

如果您在調試模式下運行,錯誤報告包含更詳細的信息,例如,調用堆棧中的行號。

5

ToString()返回Message以及StackTrace
ToString()也將遞歸地包括InnerException s。

ToString()返回一個更長的字符串,它在跟蹤錯誤時比Message有用得多。

2

你總是可以只是嘗試一下,看看:

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

(你會發現你是正確的,是的ToString更多的信息,包括除其他事項外堆棧跟蹤

+4

你應該使用這個catch塊代替:catch(Exception ex) Console.WriteLine(「#### TOSTRING ######」的結果); Console.WriteLine離); Console.WriteLine(); Console.WriteLine(「#### RESULT OF MESSAGE ######」);; Console.WriteLine(ex.Message); }'。這將有助於OP區分兩者的輸出 –

0

電子。ToString()會給你一個像PrintTrace這樣的詳細消息,我認爲哪個Display是異常名稱和異常被拋出的那一行,其中e.Message輸出只有一個只讀規範的可讀消息。

您可以檢查異常基類的構造

12

嘗試使用.NET反射器或類似的,看看有什麼關於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; 
} 
相關問題