web-dev-qa-db-ja.com

Javascriptで例外を再スローし、スタックを保持するにはどうすればよいですか?

Javascriptで、例外が発生したときに何らかのクリーンアップを実行したいが、例外がスタックを伝播し続けるようにします。たとえば:

try {
  enterAwesomeMode();
  doRiskyStuff(); // might throw an exception
} catch (e) {
  leaveAwesomeMode();
  throw e;
}
doMoreStuff();
leaveAwesomeMode();

このコードの問題は、例外をキャッチして再スローすると、そのポイントまでのスタックトレース情報が失われるため、その後例外が再びキャッチされた場合、スタックの上位で、スタックトレースはre -スロー。これは、実際に例外をスローした関数が含まれていないことを意味するため、残念です。

結局のところ、try..finallyは、少なくともChromeで同じ動作をします(つまり、再スローではなく、正確に問題が発生しますが、例外が存在しますハンドラーブロック)

誰かがJavascriptで例外を再スローする方法を知っていますが、それに関連するスタックトレースを保持しますか?それに失敗した場合、例外が発生したときに完全なスタックトレースをキャプチャしながら、例外セーフクリーンアップハンドラを追加する他の方法の提案はどうでしょうか。

ポインタをありがとう:)

134
Geoff

これはChromeのバグです。例外を再スローすると、コールトレースが保持されます。

http://code.google.com/p/chromium/issues/detail?id=6024

回避策はありません。

ついに問題は見当たりません。最終的にいくつかのケースでエラーコンソールに例外が静かに表示されませんが、開発ビルドでは修正されているようです。

73
Glenn Maynard

Errorオブジェクトのstackプロパティは、スローされた時点ではなく、Errorオブジェクト自体と同時に作成されます。彼らはイディオムのためにしばしば同じです

 throw new Error( "message"); 

また、記述したとおりにコードを使用すると、エラーを再スローするときにstackプロパティがnotに変更されます。

22
Mike Stay