在递归函数中防止StackOverFlow

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

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

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

任何的想法 ?

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

这样的安全机制(增量计数器,检查它不是非常大)也可以在循环中使用,其中小错误可能导致无限循环消耗大量CPU。

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

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

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

  1. 它会减慢执行速度
  2. 这不是你基层的责任
  3. 记录基类的行为

另一种方法是仅在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 } } 

来自这个网站