9

window.onerror用来捕获和记录客户端错误。我已经阅读了有关这种方法的各种警告,但我无法找到有关此特定案例的任何信息。

由于某种原因,IE9 似乎没有捕获堆栈溢出异常。下面的示例在 Chrome 和 Firefox 中运行以及我在 IE9 中使用 devtools 并将浏览器模式设置为 IE8 或 IE7 时捕获了这两个错误。但是,在 IE9 模式下运行时,它只捕获'test' is undefined异常,而忽略堆栈溢出异常。

我整理了一个简单的例子来证明这一点:

window.onerror = errorHandler;

function errorHandler (msg) {
    alert(msg);        
}

setTimeout(function () {
    test.test = "test";
}, 1000);

setTimeout(function stackoverflow() {
    stackoverflow();
}, 2000);
​

这也是一个工作示例:http: //jsfiddle.net/Mzvbk/1/

任何人都可以解释为什么会这样吗?

2012 年 8 月 29 日更新

我也在Internet Explorer 开发人员中心发布了这个问题,但到目前为止它并没有给我太多帮助。

在这一点上,最好的猜测(正如@RyanKinal 在他的评论中所建议的那样)是,由于超出了调用堆栈大小,因此没有空间将调用错误处理程序放在堆栈上。

我仍然愿意相信错误处理是与普通堆栈分开处理的,因为它似乎在其他浏览器(甚至是旧版本的 IE)中,但如果不是这种情况,很高兴看到参考,错误报告或某种声明,表明这实际上是 IE9 的情况。

2012 年 9 月 5 日更新

正如 Ren 和 Vega 在他们的评论中所描述的,Firefox 15 有时(似乎是随机的)似乎也吞下了这个例外。

4

1 回答 1

7

您是否尝试过在浏览器上禁用脚本调试?

当他们的 onerror 处理程序没有被调用时,会出现一个困扰许多开发人员的常见问题,因为他们为 Internet Explorer 启用了脚本调试。如果您安装了 Microsoft Script Debugger 或 Microsoft Visual Studio 6.0®(特别是 Visual InterDev 6.0™),则默认情况下会出现这种情况——错误处理是这些产品启动调试器的方式。

来源(包括有关如何禁用它的详细信息)。


跟进评论的其他信息:

然后我想知道它是否与此有关:

Internet Explorer 9 使用 Visual Studio 2010 提供的新 C++ 编译器进行编译。此编译器包含一个称为增强型 GS (又称堆栈缓冲区溢出检测)的功能,它通过检测堆栈损坏并在遇到此类损坏时避免 执行来帮助防止堆栈缓冲区溢出。

来源

听起来它可能是作为一种保护机制在溢出之前停止?

于 2012-09-04T10:04:40.397 回答