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

Jul*_*oux 46 javascript error-handling onerror

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

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

任何线索?

Arc*_*ron 47

现在可以在某些浏览器中使用.该规范已更新为包括与堆栈跟踪作为第五个参数的实际错误.

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

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
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 至少适用于Chrome,IE11和Firefox> = 31.我还没有测试过Safari和移动版本.现在似乎得到了很好的支持. (4认同)

Mrc*_*ief 10

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

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

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

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

  • 荡.堆栈跟踪实际上是我正在寻找的东西之一:/不确定我理解为什么这不能以某种方式"持久化",因为它是一个字符串数组虽然... (5认同)
  • @Mrchief它不仅仅是chrome(firefox),我怀疑它是最近的.你对这个问题的回答是正确的,但是你的推理是无效的 - 对于每个浏览器(我已经检查过),错误都有`stack`属性,无论执行上下文如何,它都会被维护.无论你的陈述是否正确,它仍然值得纠正. (3认同)
  • @Mrchief这是不正确的,至少在Chrome中是这样.Stacktraces即使在其封闭范围"完成"时也可用.举例说明:`try {throw new Error("err!"); } catch(e){window.the_error = e; }; 的console.log(window.the_error.stack);` (2认同)
  • @Nevir:我明白了.但它不是保留的`Error`对象.您正在创建一个变量并在全局(窗口)范围内保持它.它们就像任何其他全局变量一样.这是侵入性的,需要你把所有东西都包裹在`try ... catch`中.OP询问的是获取最后的错误细节而不必诉诸此类手动黑客. (2认同)

Fiz*_*han 5

现代浏览器完全支持为HTML 5规范草案的ErrorEventwindow.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);
});
Run Code Online (Sandbox Code Playgroud)