在递归函数中防止StackOverFlow

时间:2011-01-28 06:31:19

标签: c# reflection stack-overflow

我在BaseClass中有一个递归函数,它依赖于protected virtual函数的返回条件。

子类可能会错误地覆盖此函数并导致StackOverFlow异常。最糟糕的是网络呼叫速度很慢,而且很快就会发生异常(许多资源浪费了很长时间)。

我正在寻找一种在基类中以某种方式在早期阶段检查StackOverFlow的方法(可能使用Reflection和当前的递归级别。)

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

您可以将一个简单的整数'depth'传递给递归函数,并在每次后续调用时递增它。如果它大于允许的最大深度,则抛出异常,而不是等到它为时已晚并且发生了可怕的StackOverflow异常。

这种安全机制(增量计数器,检查它不是很愚蠢)在while循环中也很方便,其中一个小错误可能导致无限循环消耗大量CPU。

在拥有许多用户(例如网站)的大型系统中,有时最好采用递归和循环等方式采取这类预防措施,因为后果可能远远超出一个网页或系统的一个用户。它不是漂亮的代码,纯粹主义者毫无疑问会对此不屑一顾,但它是有效的,它是防御性的,而且是务实的。

答案 1 :(得分:1)

解决问题而不是创建变通方法。创建一个递归的私有函数,调用受保护的虚函数。

答案 2 :(得分:0)

虽然您可能会阅读调用堆栈并对其进行分析,但我不会这样做。

  1. 会减慢执行速度
  2. 这不是您的基类责任
  3. 记录您的基类'行为
  4. 另一种方法是仅在DEBUG模式下进行调用堆栈分析。这里有一些代码来了解如何获取调用堆栈。

    using System.Diagnostics;
    
    [STAThread]
    public static void Main()
    {
      StackTrace stackTrace = new StackTrace();           // get call stack
      StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)
    
      // write call stack method names
      foreach (StackFrame stackFrame in stackFrames)
      {
        Console.WriteLine(stackFrame.GetMethod().Name);   // write method name
      }
    }
    

    From this site