26

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

目前,我使用以下代码:

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

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

4

2 回答 2

46

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

来自MSDN

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

于 2013-08-28T13:58:23.690 回答
28

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

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());
}

更新

由于我收到了对此答案的支持,我想补充一点,我已停止使用此扩展方法,现在我只使用exception.ToString(). 它提供了更多信息。因此,请停止使用此方法,而只需使用.ToString(). 请参阅上面的答案

于 2013-08-28T13:53:28.763 回答