在 Javascript 中,假设我想在发生异常时执行一些清理,但是让异常继续向上传播堆栈,例如:
try {
enterAwesomeMode();
doRiskyStuff(); // might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
这段代码的问题在于,捕获和重新抛出异常会导致到该点为止的堆栈跟踪信息丢失,因此,如果随后再次捕获异常,在堆栈的上层,堆栈跟踪只会下降到重新抛出。这很糟糕,因为这意味着它不包含实际抛出异常的函数。
事实证明,试试看。.Finally 也有同样的行为,至少在 Chrome 中是这样的(也就是说,问题不在于重新抛出,而在于是否存在任何异常处理程序块)
有人知道在 Javascript 中重新抛出异常但是保留与其相关的堆栈跟踪的方法吗?如果做不到这一点,那么如何建议使用其他方法来添加异常安全的清除处理程序,同时在发生异常时捕获完整的堆栈跟踪?
谢谢你的建议:)