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

使用window.onerror获取实际的Javascript错误对象,javascript,error-handling,onerror,Javascript,Error Handling,Onerror,Javascript有一个很棒的回调窗口.onerror。跟踪任何错误都很方便。但是,它使用错误名称、文件名和行进行调用。它当然没有从try…catch语句中获取实际的错误对象那么丰富。 实际的错误对象包含更多的数据,所以我正在尝试获取这些数据。不幸的是,当您开始使用异步代码时,try…catch语句不能正常工作 有没有一种方法可以将这两个世界结合起来并充分利用?我最初寻找一种方法来获取onerror块中触发的最后一个错误,但JS似乎没有存储该错误 有什么线索吗?如果您指的是错误对象的堆栈跟踪,

Javascript有一个很棒的回调
窗口.onerror
。跟踪任何错误都很方便。但是,它使用错误名称、文件名和行进行调用。它当然没有从
try…catch
语句中获取实际的错误对象那么丰富。 实际的错误对象包含更多的数据,所以我正在尝试获取这些数据。不幸的是,当您开始使用异步代码时,
try…catch
语句不能正常工作

有没有一种方法可以将这两个世界结合起来并充分利用?我最初寻找一种方法来获取
onerror
块中触发的最后一个错误,但JS似乎没有存储该错误


有什么线索吗?

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

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

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


您可以通过在
onerror
处理程序中检查
窗口。event
(在FF上不可用)来获得一些里程数。

这在某些浏览器中现在是可能的。 已更新,将stacktrace作为第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
    }
};

现代浏览器完全支持HTML 5草稿规范和
window.onerror
。在这两种浏览器中,您既可以使用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);
});

该死。堆栈跟踪实际上是我正在寻找的东西之一:/我不知道为什么它不能以某种方式“持久化”,因为它是一个字符串数组……看看这个:可能对您的情况有帮助,但不确定。@Mrchief这是不正确的,至少在Chrome中是这样。堆栈跟踪即使在其封闭范围为“完成”时也可用。举例说明:
try{throw new Error(“err!”);}catch(e){window.the_Error=e;};log(window.the_error.stack)
@Mrchief这不仅仅是chrome(firefox也是),我怀疑这是最近的事。您对该问题的回答是正确的,但您的推理是无效的-对于每个错误具有
堆栈属性的浏览器(我已经检查过),无论执行上下文如何,都会维护该属性。无论你的陈述过去是否正确,它仍然值得纠正。@Never:我理解。但保留的不是
错误
对象。您正在创建一个变量并在全局(窗口)范围内保留它。它们就像任何其他全局变量一样。这是一种干扰,要求您将所有内容都包装在一个
try…catch
中。OP要求的是获得最后一个错误的详细信息,而不必求助于此类手动破解。要捕获错误,请覆盖setTimeout和setInveral等函数,并在其中设置try-catch循环。您将能够捕获所有错误。有意义吗?有没有一种好方法可以将此错误传递给ng应用程序中包含的angular.js服务?至少在Chrome、IE11和Firefox>=31上有效。我还没有测试过Safari和mobile版本。现在似乎得到了很好的支持。@user2151819好消息如果我想命名一个函数,syntac是什么?。。。window.onerror=MyErrorFunction