为什么window.onerror没有捕获IE9中的堆栈溢出错误?

时间:2012-08-20 19:49:32

标签: javascript error-handling internet-explorer-9 stack-overflow

我正在使用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 Developer Center上发布了这个问题,但到目前为止它还没有给我太多。

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

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

2012年9月5日更新

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

1 个答案:

答案 0 :(得分:7)

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

  

许多开发人员遇到的常见问题出现在他们的错误上   处理程序未被调用,因为它们已启用脚本调试   IE浏览器。如果你有,那将是默认情况   安装了Microsoft Script Debugger或Microsoft Visual Studio   6.0®(特别是Visual InterDev 6.0™) - 错误处理是这些产品启动调试器的方式。

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


跟进评论的其他信息:

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

  

使用提供的新C ++编译器编译Internet Explorer 9   使用Visual Studio 2010.此编译器包含一个称为的功能   增强的GS aka堆栈缓冲区溢出检测,有助于防止   堆栈缓冲区溢出通过检测堆栈损坏和避免   如果遇到这种腐败,执行。

Source

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