1

我一直在使用 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() 也会将堆栈加深几个级别,所以我知道这可能会发生。但是,有一些值得深思的地方:

  1. 在 Visual Studio 2012 中选择Visual Studio(ASP.NET) 开发服务器(以下简称 Cassini)没有问题,所以我的 IIS 设置或类似的设置是可疑的。
  2. 发生异常时的堆栈还不够深。
  3. 这仅在调试时发生。无论配置如何(即调试/发布)。

编辑:我尝试更改IIS Express设置,但没有任何区别。此外,尝试本地 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时犯了错误,但现在我完全迷失了。

4

1 回答 1

1

这是我作为解决方法所做的:

  1. 我在下面添加到 .csproj 文件以定义 IDE 的当前版本。 图片
  2. 定义的 DEBUG 常量
  3. 使用预处理器指令添加条件。

    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.");
        }
    }
    

    constnat MAXIMUM_STACK_DEPTH_FOR_VS12 是手动找到的最大数字,不会导致任何问题。

    现在,我可以在不更改任何内容的情况下调试和发布应用程序,但仍然很想听听您的意见。

于 2013-10-24T05:07:38.383 回答