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