使用window.onerror获取实际的Javascript Error对象

时间:2011-08-17 20:34:36

标签: javascript error-handling onerror

Javascript有这个很棒的回调window.onerror。跟踪任何错误都非常方便。但是,它调用错误名称,文件名和行。它肯定没有从try...catch语句中获取实际错误对象那么丰富。 实际的错误对象包含更多的数据,所以我试图得到它。不幸的是,当你开始使用异步代码时,try...catch语句不能正常工作。

有没有办法结合并获得两全其美?我最初寻找一种方法来获取onerror块中触发的 last 错误,但看起来JS并没有存储它。

有任何线索吗?

3 个答案:

答案 0 :(得分:47)

现在可以在某些浏览器中使用。 spec已更新为包含堆栈跟踪的实际错误作为第5个参数。

问题是并非每个浏览器都支持这个,所以你可以这样做:

window.onerror = function(message, filename, lineno, colno, error)
{
    if(error != null)
    {
        //handle the error with stacktrace in error.stack
    }
    else
    {
        //sadly only 'message', 'filename' and 'lineno' work here
    }
};

答案 1 :(得分:10)

如果您指的是错误对象的堆栈跟踪,那么AFAIK,这是不可能的。

简单的原因是堆栈跟踪与执行上下文相关,在执行上下文中创建或抛出运行时异常(使用try ... catch ... finally处理)(使用new Error()throw )。

当调用window.onerror时,在不同的上下文中调用它。

通过检查window.event处理程序中的onerror(在FF上不可用),您可以获得一些里程。

答案 2 :(得分:5)

现代浏览器完全支持ErrorEventwindow.onerror的HTML 5草案规范。在这两种浏览器中,您可以使用window.onerror,或者(令人惊讶地!)正确绑定到'error'事件:

// Only Chrome & Opera pass the error object.
window.onerror = function (message, file, line, col, error) {
    console.log(message, "from", error.stack);
};
// Only Chrome & Opera have an error attribute on the event.
window.addEventListener("error", function (e) {
    console.log(e.error.message, "from", e.error.stack);
});