【问题标题】:JavaScript rethrowing an Exception preserving the stack traceJavaScript 重新抛出异常,保留堆栈跟踪
【发布时间】:2011-07-12 02:53:24
【问题描述】:

在 Chrome 中,当发生异常时,它会将堆栈跟踪打印到控制台日志。这非常有用,但不幸的是,在重新抛出异常的情况下,这会导致问题。

} catch (e) {
    if (foo(e)) {
        // handle the exception
    } else {
        // The stack traces points here
        throw e;
    }
}

不幸的是,jQuery.js 中的以下代码会导致所有来自事件处理程序内部的异常都出现此问题。

try {
    while( callbacks[ 0 ] ) {
        callbacks.shift().apply( context, args );
    }
}
// We have to add a catch block for
// IE prior to 8 or else the finally
// block will never get executed
catch (e) {
    throw e;
}
finally {
    fired = [ context, args ];
    firing = 0;
}

有没有办法更改throw e; 以便使用相同的堆栈跟踪重新抛出异常?

【问题讨论】:

标签: javascript stack-trace throw


【解决方案1】:

您能做的最好的事情就是抓住原始堆栈并打印它。 我在单元测试工具中使用它。

try{
  ...
}
catch(e){
    console.log(e.stack);
    console.log(e.message);
    throw(e);
}

【讨论】:

  • 注意:根据这个线程(bugs.chromium.org/p/chromium/issues/detail?id=60240),重新抛出现在在 Chrome 中有效,但我发现它只适用于单个文件中定义的代码。我的重新抛出在另一个文件中,并且它不起作用。
【解决方案2】:

这是known bug in Chrome,不幸的是我知道没有解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多