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

Chr*_*son 9 javascript stack-overflow error-handling internet-explorer-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);
?
Run Code Online (Sandbox Code Playgroud)

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

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

2012年8月29日更新

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

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

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

2012年9月5日更新

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

Ren*_*Ren 7

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

咬住许多开发人员的常见问题是,当他们的onerror处理程序未被调用时,因为他们为Internet Explorer启用了脚本调试.如果您已安装Microsoft脚本调试程序或Microsoft VisualStudio6.0®(特别是Visual InterDev 6.0™),则默认情况下就是这种情况 - 错误处理是这些产品启动其调试程序的方式.

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


跟进评论的其他信息:

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

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

(来源)

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