web-dev-qa-db-ja.com

window.onerrorを使用して実際のJavaScriptエラーオブジェクトを取得する

JavaScriptには、この素晴らしいコールバックwindow.onerrorがあります。エラーを追跡することは非常に便利です。ただし、エラー名、ファイル名、行で呼び出します。確かに、try...catchステートメントから実際のエラーオブジェクトを取得するほどリッチではありません。実際のエラーオブジェクトにはより多くのデータが含まれているので、それを取得しようとしています。残念ながら、非同期コードの作成を開始すると、try...catchステートメントは正常に機能しません。

両方の世界を組み合わせて最高のものを得る方法はありますか?私は最初、onerrorブロック内でトリガーされるlastエラーを取得する方法を探しましたが、JSがそれを格納していないようです。

どんな手掛かり?

47

エラーオブジェクトのスタックトレースを参照している場合、AFAIKの場合、これは不可能です。

単純な理由は、スタックトレースが、ランタイム例外(try ... catch ... finallyで処理された)が作成またはスローされた(new Error()またはthrowで)実行コンテキストに関連していることです。 )。

window.onerrorが呼び出されると、異なるコンテキスト内で呼び出されます。

onerrorハンドラーでwindow.event(FFでは使用不可)を検査することで、マイレージを得ることができます。

10
Mrchief

これは一部のブラウザで可能になりました。 spec が更新され、5番目のパラメーターとしてスタックトレースを使用した実際のエラーが含まれるようになりました。

問題は、すべてのブラウザーがまだこれをサポートしているわけではないため、次のようなことができるということです。

window.onerror = function(message, filename, lineno, colno, error)
{
    if(error != null)
    {
        //handle the error with stacktrace in error.stack
    }
    else
    {
        //sadly only 'message', 'filename' and 'lineno' work here
    }
};
47
Archaeron

最新のブラウザーは ErrorEvent およびwindow.onerrorのHTML 5ドラフト仕様を完全にサポートしています。これらのブラウザーの両方で、window.onerrorを使用するか、(驚くべきことに!) 'error'イベントに適切にバインドできます。

// Only Chrome & Opera pass the error object.
window.onerror = function (message, file, line, col, error) {
    console.log(message, "from", error.stack);
};
// Only Chrome & Opera have an error attribute on the event.
window.addEventListener("error", function (e) {
    console.log(e.error.message, "from", e.error.stack);
});
5
Fizer Khan