Javascriptで、例外が発生したときに何らかのクリーンアップを実行したいが、例外がスタックを伝播し続けるようにします。たとえば:
try {
enterAwesomeMode();
doRiskyStuff(); // might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
このコードの問題は、例外をキャッチして再スローすると、そのポイントまでのスタックトレース情報が失われるため、その後例外が再びキャッチされた場合、スタックの上位で、スタックトレースはre -スロー。これは、実際に例外をスローした関数が含まれていないことを意味するため、残念です。
結局のところ、try..finallyは、少なくともChromeで同じ動作をします(つまり、再スローではなく、正確に問題が発生しますが、例外が存在しますハンドラーブロック)
誰かがJavascriptで例外を再スローする方法を知っていますが、それに関連するスタックトレースを保持しますか?それに失敗した場合、例外が発生したときに完全なスタックトレースをキャプチャしながら、例外セーフクリーンアップハンドラを追加する他の方法の提案はどうでしょうか。
ポインタをありがとう:)
これはChromeのバグです。例外を再スローすると、コールトレースが保持されます。
http://code.google.com/p/chromium/issues/detail?id=6024
回避策はありません。
ついに問題は見当たりません。最終的にいくつかのケースでエラーコンソールに例外が静かに表示されませんが、開発ビルドでは修正されているようです。
Errorオブジェクトのstackプロパティは、スローされた時点ではなく、Errorオブジェクト自体と同時に作成されます。彼らはイディオムのためにしばしば同じです
throw new Error( "message");
また、記述したとおりにコードを使用すると、エラーを再スローするときにstackプロパティがnotに変更されます。