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

.net 异常上的.ToString方法是递归的吗?,.net,exception,recursion,tostring,.net,Exception,Recursion,Tostring,我在一个相当复杂的环境中工作,有时候真正的异常是一个内部异常,有好几层。。。所以我很想写这样的代码: Dim innerEx = ex.InnerException While innerEx IsNot Nothing innerEx = innerEx.InnerException End While 但是,根据以下说明,ToString方法在其InnerException上调用ToString。。。由于这是一个异常,我可以假设它将递归工作吗?它将完全递归工作,除非最外层的异常决定重写

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

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

但是,根据以下说明,ToString方法在其InnerException上调用ToString。。。由于这是一个异常,我可以假设它将递归工作吗?

它将完全递归工作,除非最外层的异常决定重写ToString(),而不调用基本版本。当然,该方法返回被重写版本决定返回的任何内容。因此,强烈建议开发人员不要在自己的异常中重写ToString,以保持对异常调用ToString()的行为是可预测的


顺便说一句,内部异常是否覆盖ToString()并不重要,因为在递归过程中不使用public(virtual)ToString()方法。相反,将调用一个私有方法ToString(bool),该方法执行所有工作,并在必要时对内部异常调用自身。

除非最外层的异常决定重写ToString(),而不调用基本版本,否则它将完全递归工作。当然,该方法返回被重写版本决定返回的任何内容。因此,强烈建议开发人员不要在自己的异常中重写ToString,以保持对异常调用ToString()的行为是可预测的


顺便说一句,内部异常是否覆盖ToString()并不重要,因为在递归过程中不使用public(virtual)ToString()方法。取而代之的是调用一个私有方法ToString(bool),它完成所有工作,并在必要时调用内部异常本身。

这里我做了类似的事情:


这里我做了类似的事情:

您可能希望在执行大量这样的字符串连接时使用。您可能希望在执行大量这样的字符串连接时使用。
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;
}