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

时间:2013-08-28 13:31:07

标签: c# .net exception exception-handling

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

目前,我使用以下代码:

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

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

2 个答案:

答案 0 :(得分:42)

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

来自MSDN

  

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

答案 1 :(得分:27)

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

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()请参阅上面的答案