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 Developer Centerにも投稿しましたが、これまでのところあまり役に立ちませんでした。

この時点で、最良の推測 (@RyanKinal のコメントで示唆されているように) は、呼び出しスタックのサイズを超えているため、スタックにエラー ハンドラーへの呼び出しを配置する余地がないことです。

エラー処理は通常のスタックとは別に処理されると信じたいのですが、他のブラウザー (IE の古いバージョンでも) にあるように見えますが、そうでない場合は、リファレンスを参照してください。これが実際にIE9に当てはまることを示すバグレポートまたは何らかの声明。

2012 年 9 月 5 日更新

Ren と Vega がコメントで説明したように、Firefox 15 は時々 (一見ランダムに) その例外も飲み込むようです。

4

1 に答える 1

7

Have you tried disabling script debugging on the browser?

A common problem that bites many developers occurs when their onerror handler is not called because they have script debugging enabled for Internet Explorer. This will be the case by default if you have installed the Microsoft Script Debugger or Microsoft Visual Studio 6.0® (specifically Visual InterDev 6.0™)—onerror handling is how these products launch their debugger.

Source (includes details on how to disable it).


Additional information following up on the comments:

Then I wonder is it related to this:

Internet Explorer 9 is compiled with the new C++ compiler provided with Visual Studio 2010. This compiler includes a feature known as Enhanced GS aka Stack Buffer Overrun Detection, which helps prevent stack buffer overruns by detecting stack corruption and avoiding execution if such corruption is encountered.

(Source)

Sounds like it could be that it is stopping before the overflow as a protection mechanism?

于 2012-09-04T10:04:40.397 に答える