如何在Javascript中重新抛出异常,但保留堆栈?

时间:2010-09-17 09:46:17

标签: javascript exception exception-handling stack-trace callstack

在Javascript中,假设我想在发生异常时执行一些清理,但让异常继续向上传播,例如:

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

此代码的问题在于捕获和重新抛出异常会导致到该点的堆栈跟踪信息丢失,因此如果随后再次捕获异常,堆栈中的堆栈更高,堆栈跟踪仅会下降重新投掷。这很糟糕,因为它意味着它不包含实际抛出异常的函数。

事实证明,try..finally具有相同的行为,至少在Chrome中(也就是说,它不是重新抛出的问题,而是存在任何异常处理程序块)。

有没有人知道在Javascript中重新抛出异常但保留与之关联的堆栈跟踪的方法?如果不这样做,那么建议其他方法来添加异常安全的清理处理程序,同时在异常发生时捕获完整的堆栈跟踪?

感谢您的任何指示:)

2 个答案:

答案 0 :(得分:70)

这是Chrome中的一个错误。重新抛出异常应该保留调用跟踪。

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

我不知道有任何解决方法。

我最后没有看到问题。在某些情况下,我确实看到异常默认情况下没有出现在错误控制台上,但是在开发版本中似乎已经修复了。

答案 1 :(得分:22)

Error对象的stack属性与Error对象本身同时创建,而不是在它被抛出的位置创建。由于成语,它们通常是相同的

   throw new Error("message");

如果您像编写代码一样使用代码,则在重新抛出错误时,堆栈属性将更改。