有没有办法在Javascript中重新抛出异常并保留堆栈跟踪信息?

7
我知道Chrome存在一个已知的bug,在Javascript中重新抛出异常时无法保留堆栈跟踪。
我在Chrome中运行以下代码:
try {
    try {
      runCodeThatMayThrowAnException();
    } catch (e) {
        // I'm handing the exception here (displaying a nice message or whatever)
        // Now I want to rethrow the exception
        throw (e);
    }
} catch (e) {
    // The stacktrace was lost here :(
}

有没有任何方法可以保留堆栈跟踪?可能是jQuery插件?有什么变通或想法吗?

你能告诉我为什么选择使用两个try...catch吗? - Grace Huang
首先,因为我需要在某个服务不可用时向用户显示友好的消息。崩溃不是一个选项。 其次,因为我需要将JavaScript异常的内容发送到后端,以便确切地知道发生了什么。也许这是一个错误,我想在客户打电话告诉我网站无法工作之前修复它。 - rcarrillopadron
但是为什么一个try...catch级别不够呢?是因为你想聚合所有的错误信息吗? - Grace Huang
不是因为我正在将更多信息添加到异常中。我不想以异常消息结束,说:“值为NaN”。我希望有一个更详细的异常,比如“从发票ID 123返回的金额等于'abc',不能被视为数字。” - rcarrillopadron
1个回答

5
在最终的catch块中尝试。
    throw e.stack;

我指的是最后一个(发送到浏览器的那个)。如果您将try/catch嵌套得更深,您需要更改之前的throws。

    function throwError() {
        var test = _undefined.propertyAccess;
    }
    try {
        try {
            try {
                throwError();
            } catch (e) {
                alert("exception: " + e.stack);
                throw e;
            }
        } catch (e) {
            console.log(e.stack);
            throw e;
        }
    } catch (e) {
        throw e.stack;
    }

这是一个奇怪的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接