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

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

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

该代码的问题在于捕获并重新抛出异常会导致直至该点的堆栈跟踪信息丢失,因此如果随后再次捕获到异常(在堆栈上更高),则堆栈跟踪只会下降至-扔。 这很糟糕,因为这意味着它不包含实际抛出异常的函数。

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

有谁知道重新抛出Javascript中的异常的方式,但保留与它相关的堆栈跟踪? 如果不这样做,那么如何增加异常安全的清理处理程序的其他方法的建议,以及在发生异常时捕获完整的堆栈跟踪?

感谢任何指针:)


这是Chrome中的一个错误。 重新发起异常应该保留呼叫追踪。

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

我不知道任何解决方法。

我终于没有看到问题。 在某些情况下,在终止后,我确实看到异常没有显示在错误控制台上,但似乎在开发版本中修复了这种异常。


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

   throw new Error("message");

如果您使用的代码与您写的代码一样,那么当您重新抛出错误时,堆栈属性将不会更改。

链接地址: http://www.djcxy.com/p/82439.html

上一篇: How can I rethrow an exception in Javascript, but preserve the stack?

下一篇: Is there a way to dump a stack trace without throwing an exception in java?