2011-01-28 82 views
8

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

子类可能会错误地覆盖此功能并导致StackOverFlow异常。最糟糕的是有一些网络电话很慢,例外情况不会很快发生(很多资源浪费很长时间)。

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

有什么想法?

+0

^vote for topic about stackoverflow。 – Robino 2014-12-24 13:10:23

回答

8

你可以通过一个简单的整数“深度”的递归函数以及与每个后续调用加一。如果它大于最大允许深度,则抛出异常,然后等待,直到它太晚,并且发生了令人生畏的StackOverflow异常。

这样的安全机制(增量计数器,检查它不是愚蠢的大)也可以在while循环中得心应手,其中一个小错误可能导致消耗大量CPU的无限循环。

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

1

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

+0

没办法。返回条件直到运行时才会显示给基类,这是由子类通过重写该方法提供的。 – Xaqron 2011-01-28 06:41:03

+0

?为什么你的基类要依赖于子类重载实现? – Pierreten 2011-01-28 06:45:37

0

尽管您可能可以阅读调用堆栈并分析它,但我不会这么做。

  1. 它会减慢执行
  2. 这不是你的基类的责任
  3. 文件的基础类的行为

另一种可能是做在调试模式下调用堆栈分析只要。这里有一段代码来看看如何获​​得调用堆栈。

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