我正在使用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有时(看似随机)似乎也吞下了这个例外。
答案 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)
听起来它可能会在溢出之前停止作为保护机制吗?