【问题标题】:Is the .ToString method on an Exception recursive?异常递归上的 .ToString 方法是否是递归的?
【发布时间】:2012-02-29 22:47:09
【问题描述】:
我在一个相当复杂的环境中工作,有时真正的异常是一个有好几层的内部异常......所以我很想写这样的代码:
Dim innerEx = ex.InnerException
While innerEx IsNot Nothing
innerEx = innerEx.InnerException
End While
但是,根据MSDN documentation,ToString 方法在其 InnerException 上调用 ToString...因为这是一个异常,我可以假设这将递归工作吗?
【问题讨论】:
标签:
.net
exception
recursion
tostring
【解决方案1】:
它将完全递归地工作,除非最外面的异常决定覆盖 ToString() 而不调用基本版本。然后,该方法当然会返回被覆盖的版本决定返回的任何内容。因此,强烈建议开发人员不要在他们自己的异常中重写 ToString,以保持对异常调用 ToString() 的行为可预测。
顺便说一句,如果任何 内部 异常覆盖 ToString() 并不重要,因为在递归期间,公共(虚拟)ToString() 方法不是用过的。相反,调用了一个私有方法 ToString(bool) 来完成所有工作,并在必要时在内部异常上调用自身。
【解决方案2】:
我在这里做过类似的事情:
FormatException
public static string FormatErrorMessage(Exception ex)
{
var result = "Exception: " + ex.GetType().Namespace + "." + ex.GetType().Name + "\r\n";
result += "******Exception message****\r\n";
result += ex.Message + "\r\n\r\n";
if (string.IsNullOrEmpty(ex.StackTrace) == false)
{
result += "******Stack trace**********\r\n";
result += ex.StackTrace + "\r\n\r\n";
}
if (ex.InnerException != null)
{
result += "******Inner exception******\r\n";
result += FormatErrorMessage(ex.InnerException);
}
return result;
}