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