1. ホーム
  2. javascript

[解決済み] Javascriptで例外を再投与し、スタックを保持するにはどうすればよいですか?

2022-04-22 10:31:39

質問

Javascriptで、例外が発生したときに何らかの処理を行いたいが、例外はスタック上に伝播し続けさせたいとします。

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

このコードの問題は、例外をキャッチして再スローすると、その時点までのスタックトレース情報が失われるため、その後、より高い位置で再び例外をキャッチした場合、スタックトレースは再スローの時点までしか表示されないことです。これは、実際に例外をスローした関数が含まれていないことを意味し、最悪です。

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

どなたか、Javascriptで例外を再投入しても、それに関連するスタックトレースを保存する方法をご存じないでしょうか?そうでなければ、例外が発生したときに完全なスタックトレースをキャプチャしながら、例外セーフのクリーンアップハンドラを追加する他の方法を提案するのはどうでしょうか?

ご指摘ありがとうございます :)

解決方法は?

これはChromeのバグです。 例外を再投与すると、コールトレースが保存されるはずです。

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

回避策を知らない。

finallyの問題は見当たりません。 finallyの後に例外が無言でエラーコンソールに表示されないケースはありますが、これは開発ビルドで修正されているようです。