【问题标题】:Get the actual Javascript Error object with window.onerror使用 window.onerror 获取实际的 Javascript 错误对象
【发布时间】:2011-10-29 06:32:36
【问题描述】:

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

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

有什么线索吗?

【问题讨论】:

  • 捕获错误会覆盖 setTimeout 和 setInveral 等函数,并在其中放置一个 try catch 循环。您将能够捕获所有错误。有意义吗?

标签: javascript error-handling onerror


【解决方案1】:

这在某些浏览器中现在是可能的。 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
    }
};

【讨论】:

  • 是否有一种很好的方法可以将此错误传递给 ng-app 中包含的 angular.js 服务?
  • 至少适用于 Chrome、IE11 和 Firefox >=31。我还没有测试过 Safari 和移动版本。现在似乎得到了很好的支持。
  • @user2151819 好消息
【解决方案2】:

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

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

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

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

【讨论】:

  • 当。堆栈跟踪实际上是我正在寻找的东西之一:/ 不确定我是否理解为什么它不能以某种方式“持久化”,因为它是一个字符串数组......
  • 看看这个:helephant.com/2007/05/12/diy-javascript-stack-trace 可能对你的情况有帮助,但不确定。
  • @Mrchief 不正确,至少在 Chrome 中是这样。即使它们的封闭范围“完成”,堆栈跟踪也可用。举例说明:try { throw new Error("err!"); } catch(e) { window.the_error = e; }; console.log(window.the_error.stack);
  • @Mrchief 这不仅仅是 chrome(firefox 也是),我怀疑它是最近的。您对问题的回答是正确的,但您的推理是无效的 - 对于每个错误具有 stack 属性的浏览器(我已经检查过),无论执行上下文如何,它都会得到维护。不管你的说法过去是否正确,它仍然值得更正。
  • @Nevir:我明白这一点。但它不是保留的Error 对象。您正在创建一个变量并在全局(窗口)范围内保留它。它们就像任何其他全局变量一样。这是侵入性的,需要您将所有内容包装在 try...catch 中。 OP 要求的是获得最后的错误详细信息,而无需求助于此类手动黑客。
【解决方案3】:

现代浏览器完全支持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);
});

【讨论】:

  • 如果我想命名一个函数,语法是什么?... window.onerror = MyErrorFunction
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 2013-12-22
  • 1970-01-01
  • 2012-01-16
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多