2011-05-08 70 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

相关问题