コアポイント
window.onerror
は、猛かけられていないJavaScriptエラーがスローされたときにトリガーされるブラウザイベントであり、クライアントエラーを記録してサーバーに報告する簡単な方法を提供します。すべての最新のブラウザはこのイベントをサポートしていますが、実装の詳細はさまざまです。 window.onerror
window.onerror
この記事は、セントリーとのコラボレーションで作成されています。 SitePointを可能にしたパートナーをサポートしてくれてありがとう。
は、無作法なJavaScriptエラーがスローされるたびにトリガーされる特別なブラウザイベントです。これは、クライアントエラーを記録してサーバーに報告する最も簡単な方法の1つです。これは、SentryのクライアントJavaScript統合(Raven-JS)が機能する主なメカニズムの1つでもあります。 window.onerror
window.onerror
onerror
エラーがスローされると、次のパラメーターが関数に渡されます。
window.onerror = function (msg, url, lineNo, columnNo, error) { // ... 处理错误 ... return false; }
- 「congaught referenceError:fooは定義されていない」などのエラーに関連付けられたメッセージ
msg
url
lineNo
columnNo
error
一見すると、エラーオブジェクトは特別ではありません。メッセージ、ファイル名、およびLinEnumberの3つの正規化されたプロパティが含まれています。これらの冗長な値は、
を介して提供されています。 貴重な部分は、 非標準属性:です。このスタックプロパティは、エラーが発生したときに各プログラムフレームのソース位置を示します。エラースタックトレースは、デバッグの重要な部分になる可能性があります。非標準ですが、このプロパティはすべての最新のブラウザで利用できます。
以下は、フォーマット後のものです。
フォーマット後、エラーのデバッグを支援する上でスタックプロパティがどのように重要であるかを簡単に確認できます。
各フレームの形式は異なるだけでなく、詳細が少ないだけです。たとえば、Chromeは、新しいキーワードが使用されていることを認識しており、評価呼び出しをより深く理解しています。これは、IE 11とChromeの比較にすぎません。他のブラウザには、異なる形式と詳細も同様です。
ブラウザー互換性<
はしばらくの間ブラウザで存在していました - IE6やFirefox 2などの古いブラウザで見つけることができます。
問題は、各ブラウザが異なる方法で、特にOnerrorリスナーに送信されるパラメーターの数とこれらのパラメーターの構造の観点から、異なる方法で
インターネットエクスプローラー8、9、10の エラーオブジェクトがない場合、スタックトレースプロパティはありません。これは、これらのブラウザが try/catchを使用して、window.onerror しかし、回避策があります - アプリケーションのコードをトライ/キャッチブロックでラップして、自分でエラーをキャッチできます。このエラーオブジェクトには、すべての最新のブラウザで夢見るスタック属性が含まれます。 一連のパラメーターを使用してオブジェクト上の関数を呼び出す次のヘルパーメソッドを検討してください。
JavaScriptはシングルスレッドであるため、どこでもラッパーを使用する必要はありません。新しいスタックごとに開始してください。
アプリケーションの開始時(たとえば、jqueryを使用する場合、 や OK、あなたは仕事をしました - あなたはを挿入しました、そして、あなたはまた、できるだけ多くのエラー情報をキャプチャするために、トライ/キャッチブロックに関数をラップしました。
異なるソースでエラーを送信する必要がある場合、レポートエンドポイントはクロスドメインリソース共有(CORS)をサポートする必要があることに注意してください。 これを行った場合、自分の基本的なエラー報告ライブラリをスクロールしてアプリケーションと統合するために必要なすべてのツールがあります。
JavaScriptの およびTry-CatchはどちらもJavaScriptでのエラー処理に使用されますが、動作が異なります。 Try-Catchステートメントを使用すると、トライブロックにエラーをスローする可能性のあるコードをラップして、キャッチブロックのエラーに応答する可能性のあるコードをラップすることにより、エラーを直接処理できます。一方、 を使用するには、エラーが発生したときに呼び出される関数を定義する必要があります。この関数は、エラーメッセージ、エラーが発生した場合のURL、行番号、列番号、エラーオブジェクトの5つのパラメーターを使用する必要があります。この関数内では、必要に応じてエラーを処理できます。たとえば、エラーをコンソールにログに記録したり、レポートをサーバーに送信したり、ユーザーにメッセージを表示したりできます。 イベントをトリガーできない場合があります。 エラーオブジェクトは、 Stack Traceは、エラーが発生したときにプログラム実行パスに関する情報を提供するレポートです。エラーを引き起こしている関数呼び出しのシーケンスが表示されます。これは、デバッグに非常に役立ちます。 JavaScriptでは、エラーオブジェクトからスタックトレースを取得できます。 JavaScriptでは、エラーオブジェクトからスタックトレースを取得できます。エラーが発生すると、エラーオブジェクトが作成され、 はい、 CORSエラーまたはクロスドメインリソース共有エラーは、Webアプリケーションが異なるドメインからリソースにアクセスしようとすると発生します。これらのエラーはセキュリティに関連しており、セキュリティ上の理由により、 以上がwindow.onerrorを使用してJavaScriptエラーをキャプチャおよびレポートしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。Error.prototype.stack
window.onerror = function (msg, url, lineNo, columnNo, error) {
// ... 处理错误 ...
return false;
}
<code>"Error: foobar\n at new bar (<anonymous>:241:11)\n at foo (<anonymous>:245:5)\n at <anonymous>:250:5\n at <anonymous>:251:3\n at <anonymous>:267:4\n at callFunction (<anonymous>:229:33)\n at <anonymous>:239:23\n at <anonymous>:240:3\n at Object.InjectedScript._evaluateOn (<anonymous>:875:140)\n at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34)"
</anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></code>
<code>Error: foobar
at new bar (<anonymous>:241:11)
at foo (<anonymous>:245:5)
at callFunction (<anonymous>:229:33)
at Object.InjectedScript._evaluateOn (<anonymous>:875:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34)
</anonymous></anonymous></anonymous></anonymous></anonymous></code>
window.onerror
以下は、ほとんどのブラウザでOnErrorに渡されたパラメーターの表です。
onerror
の限られたサポートは驚くことではないかもしれません。しかし、SafariがSafari 10(2016年にリリース)までエラーオブジェクトのサポートを追加しなかったことに驚くかもしれません。さらに、ストックAndroidブラウザ(現在はChrome Mobileに置き換えられている)を使用しているレガシーモバイルデバイスはまだ存在し、エラーオブジェクトは渡されません。 onerror
によってキャプチャされたエラーから貴重なスタック情報を取得できないことを意味します。 invoke
window.onerror = function (msg, url, lineNo, columnNo, error) {
// ... 处理错误 ...
return false;
}
invoke
もちろん、これをどこでも手動で行うのは非常に面倒です。一般的なラッパーユーティリティ関数を作成することで、それを簡素化できます:<code>"Error: foobar\n at new bar (<anonymous>:241:11)\n at foo (<anonymous>:245:5)\n at <anonymous>:250:5\n at <anonymous>:251:3\n at <anonymous>:267:4\n at callFunction (<anonymous>:229:33)\n at <anonymous>:239:23\n at <anonymous>:240:3\n at Object.InjectedScript._evaluateOn (<anonymous>:875:140)\n at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34)"
</anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></code>
<code>Error: foobar
at new bar (<anonymous>:241:11)
at foo (<anonymous>:245:5)
at callFunction (<anonymous>:229:33)
at Object.InjectedScript._evaluateOn (<anonymous>:875:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34)
</anonymous></anonymous></anonymous></anonymous></anonymous></code>
イベントハンドラー(例えば、
これがたくさんの仕事のように見えても、心配しないでください!ほとんどのバグレポートライブラリには、$(document).ready
)addEventListener
または$.fn.click
)setTimeout
例:requestAnimationFrame
<code>Error: foobar
at bar (Unknown script code:2:5)
at foo (Unknown script code:6:5)
at Anonymous function (Unknown script code:11:5)
at Anonymous function (Unknown script code:10:2)
at Anonymous function (Unknown script code:1:73)</code>
addEventListener
サーバーにエラーを転送しますsetTimeout
window.onerror
このWebサービスがWebアプリケーションと同じドメインにある場合は、xmlhttprequestを使用してください。次の例では、jQueryのajax関数を使用してデータをサーバーに転送します。
function invoke(obj, method, args) {
return obj[method].apply(this, args);
}
invoke(Math, 'max', [1, 2]); // 返回 2
Window.onerrorを使用してJavaScriptエラーをキャプチャして報告するために、FAQ(FAQ)
JavaScriptで機能はどのように機能しますか? window.onerror
window.onerror
とTry-Catchの違いは何ですか?
window.onerror
window.onerror
は、猛攻撃のランタイムエラーが発生したときにトリガーされるグローバルイベントハンドラーです。これは、トライキャッチブロックからスリップするエラーをキャッチする、より一般的なエラー処理メカニズムです。 window.onerror
を使用してJavaScriptエラーをキャッチするにはどうすればよいですか?
window.onerror
window.onerror
window.onerror
は強力なエラー処理ツールですが、いくつかの制限があります。ほとんどの無攻撃のランタイムエラーをキャッチできますが、トライキャッチブロックにスローされて捕獲された例外をキャッチすることはできません。さらに、ネットワークエラーやCORSエラーなどの特定のタイプのエラーは、window.onerror
window.onerror
window.onerror
でエラーオブジェクトを使用する方法は? window.onerror
関数に渡された5番目のパラメーターです。エラーメッセージ、エラー名、スタックトレースなど、エラーに関する情報が含まれています。このオブジェクトを使用して、エラーに関するより詳細な情報を取得できます。これは、デバッグやエラーの報告に非常に役立ちます。 JavaScriptのスタックトレースは何ですか?
JavaScriptでスタックトレースを取得する方法は?
window.onerror
関数に渡されます。このオブジェクトには、スタックトレースを含むスタックと呼ばれるプロパティがあります。このプロパティにアクセスして、スタックトレースを取得できます。
window.onerror
を使用してエラーをサーバーに報告できますか? window.onerror
を使用してサーバーにエラーを報告できます。 window.onerror
関数の内部では、エラーメッセージを使用してリクエストをサーバーに送信できます。これは、ユーザーからリアルタイムでエラーデータを収集および分析できるため、監視とデバッグに非常に役立ちます。
window.onerror
を使用してCORSエラーを処理するにはどうすればよいですか? window.onerror
イベントハンドラーの詳細は提供されていません。ただし、CORSエラーを引き起こす可能性のある特定のネットワークリクエストにエラーハンドラーを追加することにより、これらのエラーを処理できます。
window.onerror
を使用するためのベストプラクティスは何ですか? window.onerror
を使用する場合、ユーザーエクスペリエンスを中断しない方法でエラーを処理してください。ユーザーに技術的なエラーメッセージが表示されないようにする必要があります。代わりに、友好的なエラーメッセージの表示または静かにエラーを記録することを検討してください。また、エラー処理コードのパフォーマンスへの影響に注意してください。たとえば、サーバーにエラーレポートを送信している場合は、メインスレッドをブロックしないように、これを非同期的に必ず実行してください。