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

JavaScript有这个伟大的callbackwindow.onerror 。 跟踪任何错误非常方便。 但是,它会调用错误名称,文件名和行。 这当然不像从try...catch语句中获取实际的错误对象那么丰富。 实际的错误对象包含更多的数据,所以我试图去解决这个问题。 不幸的是,当你开始拥有asynchronous代码时, try...catch语句不能正常工作。

有没有办法把两个世界的最好结合起来? 我最初寻找一种方法来获取在onerror块内触发的最后一个错误,但它看起来像JS不存储。

任何线索?

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

简单的原因是堆栈跟踪与运行时exception(最终用try … catch处理)的执行上下文是相关的(使用new Error()throw )。

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

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

这在一些浏览器中是可能的。 规范已更新,以包括堆栈跟踪的实际错误作为第五个参数。

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

 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 } }; 

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

 // 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); });