在递归函数中防止StackOverFlow
我在BaseClass
有一个递归函数,它依赖于protected virtual
函数来获取它的返回条件。
子类可能会错误地覆盖此函数并导致StackOverFlow
exception。 最糟糕的是网络呼叫速度很慢,而且不会很快发生exception(许多资源浪费了很长时间)。
我正在寻找一种方法来在早期阶段以某种方式在基类中检查StackOverFlow
(可能使用Reflection
和当前的递归级别)。
任何的想法 ?
您可以将一个简单的整数“深度”传递给递归函数,并在每次后续调用时递增它。 如果它大于允许的最大深度,则抛出exception,而不是等到它为时已晚并且发生了可怕的StackOverflow
exception。
这样的安全机制(增量计数器,检查它不是非常大)也可以在循环中使用,其中小错误可能导致无限循环消耗大量CPU。
在具有许多用户(例如网站)的大型系统中,有时最好采用递归和循环等预防措施,因为后果可能远远超出一个网页或系统的一个用户。 它不是漂亮的代码,纯粹主义者毫无疑问会对它不屑一顾,但它是有效的,它是防御性的,而且是务实的。
解决问题而不是创建变通方法。 创建一个递归的私有函数,调用受保护的虚函数。
虽然您可能可以读取调用堆栈并对其进行分析,但我不会这样做。
- 它会减慢执行速度
- 这不是你基层的责任
- 记录基类的行为
另一种方法是仅在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 } }
来自这个网站