捕获所有内部异常详细信息的最佳做法是什么
本文关键字:最佳 是什么 详细信息 异常 内部 | 更新日期: 2023-09-27 18:29:24
记录完整异常详细信息(包括所有可能的内部异常)的最佳做法是什么?
目前,我使用以下代码:
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()
吗?它提供了您需要诊断的大部分(如果不是全部的话)数据,包括消息详细信息、堆栈跟踪和内部异常:
来自MSDN:
ToString返回当前异常的表示形式旨在被人类理解。异常包含的位置区域性敏感数据,ToString返回的字符串表示形式需要考虑当前的系统文化。虽然对于返回字符串的格式没有确切的要求,它应该试图反映物体的价值用户。ToString的默认实现获得引发当前异常的类、消息、对内部异常调用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());
}
更新
由于我收到了这个答案的赞成票,我想补充一点,我已经停止使用这个扩展方法,现在我只使用exception.ToString()
。它提供了更多信息。所以,请停止使用这种方法,只使用.ToString()
请参阅上面的答案。