すべてのJavaScriptの未処理の例外をキャッチする


112

アプリケーションで未処理のjavascript例外をすべてアラートボックスに表示する方法を見つけようとしています。サーバー側のコードを使用せずに、これらすべてをクライアント側で実行したいと思います。環境としてMVC3を使用しています。

私は過去数日間研究していて、探しているものが正確に見つかりませんでした。

以下の2つの方法が見つかりましたが、それらはほとんど私が探しているもののようですが、これらの方法は、関数名をカスタムメソッドに渡して、そのメソッド内のすべての未処理の例外のスタックトレースを出力する必要があるように設定されています特定の機能。未処理の例外すべてのスタックトレースを出力するカスタムメソッドに関数名を手動で渡す必要がない方法を探しています。これらのカスタムメソッドで、アプリケーション全体で処理されないすべての例外を「リッスン」したいと思います。

http://eriwen.com/javascript/js-stack-trace/

また、前のリンクに似たもの:

https://github.com/eriwen/javascript-stacktrace

指定されたJavaScript関数のスタックトレースを出力する上記の2番目のリンクからの基本的なコードは次のとおりです。

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

つまり、これを要約すると、何らかの「リスナー」がすべてのjavascriptの未処理の例外をリッスンし、アラートボックスの画面に出力する方法を知っていますか?

ありがとう!ジェイソン


1つ...警告ボックスを使用するのはなぜですか。あなたはconsole.log(error_message)を使用して....
Mathlight

1
私はこの質問が すべてのJSエラーキャッチすると役立つと思います
Pilgerstorfer Franz

:あなたは、おそらくこの質問を見ている必要があり stackoverflow.com/questions/205688/...
マーク

回答:


129

window.onerrorメソッドを使用してこれを行うことができます。

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
アプリ全体をtry / catchブロックでラップするよりもはるかに優れています。:)ありがとう!
アンソニー

15
「いくつかの/多くのエラーイベントはwindow.onerrorをトリガーしないことに注意してください。具体的にはそれらをリッスンする必要があります。」- developer.mozilla.org/en-US/docs/Web/API/...
shusson

6
そのコードに関数名(myErrorHandler)を含める必要はありません...関数(errorMsg、url、lineNumber)にすることができます
JoelFan

18
@JoelFanデバッグのためには、関数名を使用することをお勧めします。デバッガーは、無名関数として表示する代わりに関数名を使用します。
ジェリナウ2017年

これは素晴らしく、感謝です!ランダムに失敗し、何が起こったかを確認するための「コンソール」または「開発者」ウィンドウがないモバイルサファイを除いて、100%正常に機能する複雑な写真ズームスクリプトをデバッグしようとしました。確かに私は秘密のボタンでオンにできる独自の「デバッグ」ウィンドウを持っていますが、「試行/キャッチ」していないすべてのエラーをグローバルに表示する方法がありませんでした。この追加により、問題がどこにあるのかが正確にわかり、髪の毛をより多く引き裂くことがなくなりました!これに2度賛成できることを願っています。
ランディ

48

を使用するかwindow.onerror、(驚くべきことに!) 'error'イベントに適切にバインドできます。

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

JavaScriptエラーを追跡したい場合は、Atatusを試すことができます。私はアタトゥスで働いています。


7
なぜあなたは「偽りを返す」のですか?
kumaresan_sd

:@kumaresan_sdそれは火にデフォルトイベントハンドラができますdeveloper.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/...
イェンスBodal

29

に加えて

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

イベントを.then()リッスンするpromiseコールバック()内で発生したすべてのエラーをキャッチすることもできますunhandledrejection

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
両方を使用することが必要であるwindow.onerrorwindow.addEventListener("error"、あるいは十分にそれらのいずれかを使用していますか?
Tormod Haugene

2
それらの1つを使用できます。を使用する場合はwindow.addEventListener("error"、バブルアップしなかった要素のエラーもキャッチするためにuseCapturesetを送信trueします。developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/...
ハビエル・ペレス

1
ありがとうございました!!errorイベントは、私の特定のエラーをキャッチしていませんでした。unhandledrejectionそれを得た。
ジョー

throw new Error('tja');このアプローチでは
最新の

1
@JavierPerez v80を使用してテストしたところ、イベントにアタッチされ、すぐにエラーがスローされました。キャッチされず、構文エラーもキャッチされませんでした。
OZZIE

1

Log4Jに基づくhttp://log4javascript.orgを確認してください。ほとんどのコードがtry / catchステートメントでラップされて例外を処理する場合、このライブラリを、エンドユーザーが見ることができる常に利用可能な「ダイアログボックス」またはロギングウィンドウに出力を送信するための共通インターフェイスとして利用できます。ダイアログボックスの内容をプリンターまたはPDFに印刷するためにwindow.print()を実行するボタンを使用することもできます。幸運を。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.