Javascript有这个很棒的回调window.onerror
。跟踪任何错误都非常方便。但是,它调用错误名称,文件名和行。它肯定没有从try...catch
语句中获取实际错误对象那么丰富。
实际的错误对象包含更多的数据,所以我试图得到它。不幸的是,当你开始使用异步代码时,try...catch
语句不能正常工作。
有没有办法结合并获得两全其美?我最初寻找一种方法来获取onerror
块中触发的 last 错误,但看起来JS并没有存储它。
有任何线索吗?
答案 0 :(得分:47)
现在可以在某些浏览器中使用。 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
}
};
答案 1 :(得分:10)
如果您指的是错误对象的堆栈跟踪,那么AFAIK,这是不可能的。
简单的原因是堆栈跟踪与执行上下文相关,在执行上下文中创建或抛出运行时异常(使用try ... catch ... finally处理)(使用new Error()
或throw
)。
当调用window.onerror
时,在不同的上下文中调用它。
通过检查window.event
处理程序中的onerror
(在FF上不可用),您可以获得一些里程。
答案 2 :(得分:5)
现代浏览器完全支持ErrorEvent和window.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);
});