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


151

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

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

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

結局のところ、try..finallyは少なくともChromeで同じ動作をします(つまり、問題の原因となっているのは再スローではなく、例外ハンドラーブロックの存在です)。

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

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


回答:


78

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

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

回避策はわかりません。

ようやく問題が出てきません。ようやく例外が発生した後、ようやく例外がエラーコンソールに表示されなくなりましたが、開発ビルドで修正されているようです。


4
この問題は解決されました。
Zachary Burns

24

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

   新しいError( "message");をスローします。

コードを記述したとおりに使用した場合、エラーを再スローしてもスタックプロパティは変更されません


5
これは正しくありません(おそらくプラットフォームに依存します)。現在使用しているjsエンジン(Rhino)は、throwステートメントのスタックをリセットし、元のスタックを失います。
Ted Bigham、2017年

1
おそらくそうかもしれませんが、rhino-1.7.7.2.jarはそれを変更しません。どのバージョンを使用していますか?
マイクステイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.