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

标签 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 中具有相同的行为(也就是说,问题不在于重新抛出,而是任何异常处理程序 block 的存在。)

有谁知道在 Javascript 中重新抛出异常但保留与之关联的堆栈跟踪的方法?如果做不到这一点,关于添加异常安全清理处理程序的其他方法的建议如何,同时还可以在发生异常时捕获完整的堆栈跟踪?

感谢任何指点:)

最佳答案

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

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

我不知道有什么解决方法。

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

关于javascript - 如何在 Javascript 中重新抛出异常,但保留堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3734236/

相关文章:

javascript - 有没有办法突出书签的目标? (www.site.com/page.htm#bookmark)?

javascript - 设置click属性,该属性调用javascript构造函数中的原型(prototype)方法

javascript - 仅使用 javascript 的麦克风的声音 Activity 级别

c# - 应用程序立即崩溃并出现 FileNotFoundException

java - 为什么屏幕上显示的是异常而不是错误页面?

javascript - 禁用 JavaScript 时隐藏图像 map 坐标

c# - DataTableReader 对当前 DataTable 'TempTable' 无效

language-agnostic - 如何编写安全代码 : Condition checking Vs Exception handling?

c++ - 保护 COM 接口(interface)免受异常影响

asp.net-mvc - ASP.Net MVC异常记录与错误处理结合