什么是正确的方式来显示完整的InnerException?

什么是正确的方式来显示我的完整的InnerException

我发现我的一些InnerExceptions有另外一个InnerException而且这个InnerException很深。

InnerException.ToString()做我的工作,或者我需要通过InnerExceptions循环,并build立与StringBuilderString

您可以简单地打印exception.ToString() – 也将包含所有嵌套的InnerException全文。

只要使用exception.ToString()

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

ToString的默认实现获取抛出当前exception的类的名称,消息,对内部exception调用ToString的结果以及调用Environment.StackTrace的结果。 如果这些成员中的任何一个为null,则其值不包含在返回的string中。

如果没有错误信息或者是空string(“”),则不返回错误信息。 内部exception和堆栈跟踪的名称只有在它们不为空时才被返回。

exception.ToString()也将调用.ToString()该exception的内部exception,等等…

我通常这样做,以消除大部分的噪音:

 void LogException(Exception error) { Exception realerror = error; while (realerror.InnerException != null) realerror = realerror.InnerException; Console.WriteLine(realerror.ToString()) } 

当你需要完整的细节(所有消息和堆栈跟踪)和推荐的解决scheme时,Jon的答案是最好的解决scheme。

但是,可能会出现这种情况,您只需要内部消息,对于这些情况,我使用以下扩展方法:

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

当我有不同的听众进行跟踪和logging时,我经常使用这种方法,并希望对他们有不同的看法。 这样,我可以有一个侦听器,通过电子邮件将堆栈跟踪的整个错误发送到开发团队,使用.ToString()方法进行debugging,并使用每天发生的所有错误的历史logging写入日志文件带有.GetFullMessage()方法的堆栈跟踪。

如果只想显示内部exception消息的特定行,则执行以下操作:

 catch (Exception ex) { string[] myex = ex.InnerException.Message.Split('"'); MessageBox.Show(myex[15]); } 

正如我使用myex [15],因为大多数myex [15]有正确的英文,我们可以很容易地理解的消息。