40

未処理の JavaScript 例外をログに記録しようとしています。例外がキャッチされなかったときに発生するイベントはありますか? ブラウザーで JavaScript エラーが発生する前に例外をキャッチしようとしていますが、アプリケーション全体を try/catch 内で実行したくありません。どんな助けでも大歓迎です。ありがとう!

更新: tvanfosson は可能性として onerror を指摘しました。これは仕様の一部ではなく、IE または Gecko ベースのブラウザーでのみ使用できます。

詳細については - http://books.google.com/books?id=tKszhx-XkzYC&pg=PA386&lpg=PA386&dq=safari+onerror+javascript&source=web&ots=gQaGbpUnjG&sig=iBCtOQs0aH_EAzSbWlGa9v5flyo#PPA387,M1

OnError サポート表 - http://www.quirksmode.org/dom/events/error.html

Mozilla のドキュメント - https://developer.mozilla.org/en/DOM/window.onerror

WebKit バグ レポート - https://bugs.webkit.org/show_bug.cgi?id=8519

4

2 に答える 2

39

このフィドルをチェックしてください:

http://jsfiddle.net/xYsRA/1/

window.onerror = function (msg, url, line) {
    console.log("Caught[via window.onerror]: '" + msg + "' from " + url + ":" + line);
    return true; // same as preventDefault
};

window.addEventListener('error', function (evt) {
    console.log("Caught[via 'error' event]:  '" + evt.message + "' from " + evt.filename + ":" + evt.lineno);
    console.log(evt); // has srcElement / target / etc
    evt.preventDefault();
});


throw new Error("Hewwo world.  I crash you!!!");

throw new Error("Hewwo world.  I can only crash you once... :(");

どの印刷物:

Caught [via window.onerror]:'Uncaught Error:Hewwoworld。私はあなたをクラッシュさせます!!!」http://fiddle.jshell.net/xYsRA/1/show/:32fiddle.jshell.net:21から
キャッチ[via'error'event]:'Uncaught Error:Hewwoworld。私はあなたをクラッシュさせます!!!」http://fiddle.jshell.net/xYsRA/1/show/:32fiddle.jshell.net:26から
ErrorEvent {lineno:32、ファイル名: "http://fiddle.jshell.net/xYsRA/1/show/"、メッセージ: "Uncaught Error:Hewwoworld。Icrash you !!!"、clipboardData:undefined、cancelBubble: false…}
 fiddle.jshell.net:27 \

ノート:

  • 「returntrue」/「evt.preventDefault()」行を削除すると、エラーがログに記録された後、通常の方法でJSコンソールに出力されます。

  • 上記のステートメントとは異なり、window.onerrorはテストしたすべてのブラウザーで機能しました。ただし、addEventListenerメソッドはおそらくとにかく優れており、より豊富なセマンティクスを提供します。

于 2012-11-17T22:32:59.567 に答える
11

onerror ハンドラを使用してみてください。 MDN のドキュメント。これにより、エラーが検出されたときに何かを実行できますが、try/catch ブロックのように適切な方法で続行することはおそらくできません。これがどのように処理されるかは、ブラウザー間で明らかに異なることに注意してください。

于 2008-12-04T04:18:11.467 に答える