如何在Javascript中重新引发异常,但保留堆栈?
在Javascript中,假设我想在异常发生时执行一些清理,但让异常继续向上传播堆栈,例如:如何在Javascript中重新引发异常,但保留堆栈?,javascript,exception,exception-handling,stack-trace,callstack,Javascript,Exception,Exception Handling,Stack Trace,Callstack,在Javascript中,假设我想在异常发生时执行一些清理,但让异常继续向上传播堆栈,例如: try { enterAwesomeMode(); doRiskyStuff(); // might throw an exception } catch (e) { leaveAwesomeMode(); throw e; } doMoreStuff(); leaveAwesomeMode(); 这段代码的问题是捕获并重新抛出异常会导致该点之前的堆栈跟踪信息丢失,因此,如果随后再次捕
try {
enterAwesomeMode();
doRiskyStuff(); // might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
这段代码的问题是捕获并重新抛出异常会导致该点之前的堆栈跟踪信息丢失,因此,如果随后再次捕获异常,则堆栈上更高的位置,堆栈跟踪只会下降到重新抛出。这很糟糕,因为这意味着它不包含实际引发异常的函数
事实证明,try..finally至少在Chrome中具有相同的行为(也就是说,问题不在于重新抛出,而在于是否存在任何异常处理程序块)
有人知道在Javascript中重新引发异常但保留与之相关的堆栈跟踪的方法吗?如果做不到这一点,那么关于添加异常安全清理处理程序的其他方法的建议如何,同时在发生异常时捕获完整的堆栈跟踪
感谢所有的指针:)错误对象的堆栈属性是与错误对象本身同时创建的,而不是在抛出时创建的。因为成语的缘故,它们常常是一样的 throw new Error("message"); 抛出新错误(“消息”);
如果您按照编写代码的方式使用代码,则在重新显示错误时不会更改stack属性。这是Chrome中的一个错误。重新引发异常应保留调用跟踪 我不知道有什么解决办法
我最终看不出有什么问题。在某些情况下,在finally之后,我确实会看到异常在错误控制台上悄无声息地出现,但在开发构建中似乎已经修复了该异常。Dupe:这不是真的(可能取决于平台)。我现在使用的js引擎(Rhino)重置了throw语句上的堆栈,丢失了原来的堆栈。也许是这样,但是Rhino-1.7.7.2.jar没有改变它。您使用的是什么版本?此问题已解决。