2011-05-08 47 views
99

什麼是正確的方式來顯示我的完整InnerException顯示完整的InnerException的正確方法是什麼?

我發現我的一些InnerExceptions有另一個InnerException,而且這個過程非常深入。

InnerException.ToString()爲我做這項工作還是我需要循環通過InnerExceptions並建立一個StringStringBuilder

+0

爲什麼你需要顯示內部異常? – 2011-05-08 17:22:01

+19

@Akram,因爲大多數時候它是內部的異常,很有趣。一個例子是XmlSerializer,當出現錯誤時它只會拋出InvalidOperationException異常。內部的例外情況出了什麼問題。 – adrianm 2011-05-08 17:28:39

+3

@AkramShahda那麼,也許你想在你的日誌中使用這種方法? – cederlof 2012-10-04 09:15:46

回答

163

您可以簡單地打印exception.ToString() - 也將包括所有嵌套的InnerException s的全文。

+5

這也包括其他垃圾的加載,而不僅僅是異常消息和內部異常消息 – 2016-10-25 14:26:52

+0

只是爲了簡潔你不需要.ToString(),只是使用異常會做同樣的事情。 – 2017-11-24 11:15:42

34

只需使用exception.ToString()

http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx

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

如果沒有錯誤消息或者它是空字符串(「」),則不返回錯誤消息。內部異常和堆棧跟蹤的名稱只有在它們不爲空時纔會返回。

exception.ToString()也將在該異常的內部異常調用的ToString(),等等...

31

我通常做這樣的去除大部分噪聲:

void LogException(Exception error) { 
    Exception realerror = error; 
    while (realerror.InnerException != null) 
     realerror = realerror.InnerException; 

    Console.WriteLine(realerror.ToString()) 
}  
20

@當你想要完整的細節(所有消息和堆棧跟蹤)和推薦的答案時,Jon的答案是最好的解決方案。

但是,可能有情況下,當你只是想內部的消息,對於這些情況下,我使用下面的擴展方法:

public static class ExceptionExtensions 
{ 
    public static string GetFullMessage(this Exception ex) 
    { 
     return ex.InnerException == null 
      ? ex.Message 
      : ex.Message + " --> " + ex.InnerException.GetFullMessage(); 
    } 
} 

我經常使用這種方法時,我有不同的聽衆進行跟蹤和記錄並希望對他們有不同的看法。通過這種方式,我可以讓一個偵聽器通過電子郵件將堆棧跟蹤發送給開發團隊,使用.ToString()方法進行調試,並使用每天發生的沒有堆棧跟蹤的所有錯誤的歷史記錄寫入日誌文件採用.GetFullMessage()方法。

+1

僅供參考如果'ex'是一個'AggregateException',則這個輸出中不會包含任何內部異常 – kornman00 2017-04-30 05:22:14

相關問題