【问题标题】: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;
      }
      

      【讨论】:

      • 在进行大量这样的字符串连接时,您可能需要使用StringBuilder
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多