我一直在努力为一个只在Chrome上运行的Web应用程序增加更好的错误日志记录。实质上,我想能够捕获并存储堆栈跟踪信息。对于同步代码,这很有效,但对于异步代码,我遇到了一些奇怪的问题。基本上,Chrome似乎会作为其异步堆栈跟踪功能的一部分记录其他信息,但我无法找出如何捕获它。
在Chrome浏览器控制台中运行的代码:
let e;
let a = () => Promise.resolve(null)
.then(() => (null).foo)
.catch(err => {
console.info(err);
console.error(err);
e = err;
})
let b = () => a();
let c = () => b();
c();
输出:
(info)
TypeError: Cannot read property 'foo' of null
at <anonymous>:3:20
(error, after expanding)
TypeError: Cannot read property 'foo' of null
at <anonymous>:3:20
(anonymous) @ VM1963:6
Promise.catch (async)
a @ VM1963:4
b @ VM1963:9
c @ VM1963:10
(anonymous) @ VM1963:11
所以console.error
会给我一个穿过整个调用堆栈的堆栈跟踪,可能是通过某种 Chrome 引擎魔法实现的。console.info
会给我在err
上存储的实际堆栈跟踪。如果在所有这些操作完成后,我尝试读取e
的值,则其堆栈是从console.info
语句获取的两行,而不是从console.error
语句。
我的问题是,是否有任何方法可以捕获和存储Chrome在我调用console.error
时生成和使用的异步堆栈跟踪?
Object.defineProperty
来覆盖console
方法?或者类似地,使用Proxy
来捕获console
调用? - nick zoum