异常上的.ToString方法是递归的吗?

时间:2012-02-29 22:47:09

标签: .net exception recursion tostring

我在一个相当复杂的环境中工作,有时真正的异常是几层深层的内部异常...所以我很想写这样的代码:

Dim innerEx = ex.InnerException
While innerEx IsNot Nothing
  innerEx = innerEx.InnerException
End While

但是,根据MSDN documentation,ToString方法在其InnerException上调用ToString ...因为这是一个例外,我可以假设它会递归地工作吗?

2 个答案:

答案 0 :(得分:4)

除非最外层的异常决定覆盖ToString()而不调用基本版本,否则它将完全递归。然后,该方法返回被覆盖的版本决定返回的任何内容。因此,非常不鼓励开发人员在自己的异常中覆盖ToString,以便在可预测的异常上保持调用ToString()的行为。

顺便说一句,如果任何内部异常覆盖ToString(),它就会重要,因为在递归过程中公共(虚拟)ToString()方法不是用过的。而是调用私有方法ToString(bool)来完成所有工作,并在必要时调用内部异常。

答案 1 :(得分:0)

我做过类似的事情: 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;
}