什么是正确的方式来显示完整的InnerException?
什么是正确的方式来显示我的完整的InnerException
。
我发现我的一些InnerExceptions有另外一个InnerException
而且这个InnerException
很深。
将InnerException.ToString()
做我的工作,或者我需要通过InnerExceptions
循环,并build立与StringBuilder
的String
?
您可以简单地打印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]有正确的英文,我们可以很容易地理解的消息。