我在BaseClass
中有一个递归函数,它依赖于protected virtual
函数返回它的条件。在递归函数中防止StackOverFlow
子类可能会错误地覆盖此功能并导致StackOverFlow
异常。最糟糕的是有一些网络电话很慢,例外情况不会很快发生(很多资源浪费很长时间)。
我正在寻找一种方法来检查StackOverFlow
早期阶段的某种方式在基类(可能使用Reflection
和当前递归级别)。
有什么想法?
我在BaseClass
中有一个递归函数,它依赖于protected virtual
函数返回它的条件。在递归函数中防止StackOverFlow
子类可能会错误地覆盖此功能并导致StackOverFlow
异常。最糟糕的是有一些网络电话很慢,例外情况不会很快发生(很多资源浪费很长时间)。
我正在寻找一种方法来检查StackOverFlow
早期阶段的某种方式在基类(可能使用Reflection
和当前递归级别)。
有什么想法?
你可以通过一个简单的整数“深度”的递归函数以及与每个后续调用加一。如果它大于最大允许深度,则抛出异常,然后等待,直到它太晚,并且发生了令人生畏的StackOverflow
异常。
这样的安全机制(增量计数器,检查它不是愚蠢的大)也可以在while
循环中得心应手,其中一个小错误可能导致消耗大量CPU的无限循环。
在有许多用户(例如网站)的大型系统中,有时最好采用递归和while循环等预防措施,因为后果可能远远超出一个网页或系统的一个用户。这不是很漂亮的代码,纯粹主义者无疑会对此置之不理,但它很有效率,它具有防御性,而且很实用。
尽管您可能可以阅读调用堆栈并分析它,但我不会这么做。
另一种可能是做在调试模式下调用堆栈分析只要。这里有一段代码来看看如何获得调用堆栈。
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
}
}
^vote for topic about stackoverflow。 – Robino 2014-12-24 13:10:23