JavaScriptには、この素晴らしいコールバックwindow.onerror
があります。エラーを追跡することは非常に便利です。ただし、エラー名、ファイル名、行で呼び出します。確かに、try...catch
ステートメントから実際のエラーオブジェクトを取得するほどリッチではありません。実際のエラーオブジェクトにはより多くのデータが含まれているので、それを取得しようとしています。残念ながら、非同期コードの作成を開始すると、try...catch
ステートメントは正常に機能しません。
両方の世界を組み合わせて最高のものを得る方法はありますか?私は最初、onerror
ブロック内でトリガーされるlastエラーを取得する方法を探しましたが、JSがそれを格納していないようです。
どんな手掛かり?
エラーオブジェクトのスタックトレースを参照している場合、AFAIKの場合、これは不可能です。
単純な理由は、スタックトレースが、ランタイム例外(try ... catch ... finallyで処理された)が作成またはスローされた(new Error()
またはthrow
で)実行コンテキストに関連していることです。 )。
window.onerror
が呼び出されると、異なるコンテキスト内で呼び出されます。
onerror
ハンドラーでwindow.event
(FFでは使用不可)を検査することで、マイレージを得ることができます。
これは一部のブラウザで可能になりました。 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
}
};
最新のブラウザーは 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);
});