我一直在使用Visual Studio 2013编写一个针对.NET framework v3.5的Web应用程序。
其中的间接递归会导致StackOverflowException,所以我写了一个方法来检查堆栈是否溢出。
public static void CheckStackOverflow() {
StackTrace stackTrace = new StackTrace();
StackDepth = stackTrace.GetFrames().Length;
if(StackDepth > MAXIMUM_STACK_DEPTH) {
throw new StackOverflowException("StackOverflow detected.");
}
}
问题是StackOverflowException发生在第一行,即new StackTrace()
,所以我无法处理它。
我知道调用StackTrace()也会使堆栈加深几个级别,所以我知道这可能会发生。然而,有一些值得思考的东西:
编辑:我尝试changed IIS Express settings,但没有任何区别。此外,尝试本地IIS 选项也没有运气。所以,
if(RunningWithVisualStudio) { // Start Debugging or Without Debugging
if(UsingCassini) {
throw new StackOrverflowException("A catchable exception."); // expected
} else {
throw new StackOverflowException("I cannot catch this dang exception.");
}
} else { // publish on the identical ApplicationPool.
throw new StackOrverflowException("A catchable exception."); // expected
}
我以为我在配置 IIS Express 时遇到了错误,但现在我完全迷失了。
答案 0 :(得分:1)
以下是我的解决方法:
使用预处理程序指令添加条件。
public static void CheckStackOverflow() {
StackTrace stackTrace = new StackTrace();
StackDepth = stackTrace.GetFrames().Length;
int threashold;
#if (VISUAL_STUDIO_12 && DEBUG)
threshold = MAXIMUM_STACK_DEPTH_FOR_VS12; // set to be a "safe" integer
#else
threshold = MAXIMUM_STACK_DEPTH; // the one in common use
#endif
if(StackDepth > threashold) {
throw new StackOverflowException("StackOverflow detected.");
}
}
const98 MAXIMUM_STACK_DEPTH_FOR_VS12是手动找到的最大数字,不会造成任何问题。
现在,我可以在不改变任何内容的情况下调试和发布应用程序,但仍然希望听到您的意见。