捕获所有内部exception详细信息的最佳实践是什么?

记录完整exception详细信息(包括所有可能的内部exception)的最佳做法是什么?

目前,我使用以下代码:

try { //some code that throws an exception } catch(Exception ex) { do { Console.WriteLine(ex.Message+ex.StackTrace); ex=ex.InnerException; }while(ex!=null) } 

是否存在此代码可能失败的情况?

你尝试过使用ex.ToString()吗? 它提供了诊断所需的大部分(如果不是全部)数据 – 包括消息详细信息,堆栈跟踪和内部exception:

来自MSDN :

ToString返回人类应该理解的当前exception的表示。 如果exception包含区分文化的数据,则ToString返回的字符串表示forms需要考虑当前的系统区域性。 虽然对返回字符串的格式没有确切的要求,但它应该尝试反映用户所感知的对象的值。 ToString的默认实现获取抛出当前exception的类的名称,消息,在内部exception上调用ToString的结果,以及调用Environment.StackTrace的结果。 如果这些成员中的任何一个为null,则其值不包含在返回的字符串中。

我有这个扩展方法,很适合我的目的。

 public static class ExceptionExtensions { public static string ToMessageAndCompleteStacktrace(this Exception exception) { Exception e = exception; StringBuilder s = new StringBuilder(); while (e != null) { s.AppendLine("Exception type: " + e.GetType().FullName); s.AppendLine("Message : " + e.Message); s.AppendLine("Stacktrace:"); s.AppendLine(e.StackTrace); s.AppendLine(); e = e.InnerException; } return s.ToString(); } } 

并像这样使用它:

 using SomeNameSpaceWhereYouStoreExtensionMethods; try { // Some code that throws an exception } catch(Exception ex) { Console.WriteLine(ex.ToMessageAndCompleteStacktrace()); } 

更新

由于我收到了这个答案的upvotes,我想补充一点,我停止使用这个扩展方法,现在我只是使用exception.ToString() 。 它提供了更多信息。 所以,请停止使用此方法,并使用.ToString()见上面的答案