gpt4 book ai didi

javascript - 在 unhandledrejection 事件处理程序中获取堆栈跟踪

转载 作者:行者123 更新时间:2023-12-01 16:25:14 38 4
gpt4 key购买 nike

当我只使用 onunhandledrejection 捕获 Promise 拒绝时,如何确定它发生在哪里?处理程序?

console.error = ()=>{}
window.addEventListener('unhandledrejection', (promiseRejectionEvent) => {
console.log('unhandled: ', Error().stack)
})

function main() {
new Promise(() => { throw null })
}
main()

如果您在运行后检查浏览器的控制台,您将看到如下内容:
sources tab
console output Error().stack仅在其堆栈跟踪中包含拒绝处理函数本身(灰色输出 js:14:30 )。但是浏览器似乎知道拒绝发生在哪里:还有另一个红色错误输出( Uncaught (in promise) null),指向目标行( js:18)。如何访问此线路信息?
似乎后者的输出是由浏览器的内部完成的,因为它无法通过覆盖 console.error 来防止。就像上面的例子一样。只有调用 promiseRejectionEvent.preventDefault() 才能预防。 ,如 MDN 中所述.但我不想阻止它,而是取而代之,例如用于记录目的。
真实世界用例:当然可以不依赖 onunhandledrejection事件处理程序,例如通过添加 .catch()短语或至少抛出 throw new Error(null) .但就我而言,我无法控制它,因为它是第三方代码。它今天在客户端的浏览器上意外抛出(可能是库错误),并且自动错误报告不包括堆栈跟踪。我试图缩小上述潜在问题的范围。谢谢!

根据评论进行编辑:

Wrap the third party code in a try/catch? – weltschmerz


好点,但这无济于事,因为拒绝实际上发生在回调中:

window.addEventListener('unhandledrejection', (promiseRejectionEvent) => {
console.log('unhandled: ', Error().stack) // <- stack once again does *not* include "main()", it is only printed out in the console
})

function main() {
try {
thirdPartyModule()
} catch(e) {
// Never caught
console.log("caught:", e)
}
}

// Example code
// We cannot change this function
function thirdPartyModule() {
setTimeout(() =>
new Promise(() =>
{ throw null }))
}

main()

最佳答案

没有任何好的解决方案来跟踪开箱即用的异步堆栈跟踪,但可以使用 Zone.js .如果您查看 Zone.js 页面上的演示,这里有异步堆栈跟踪的示例。
Zone 通过猴子修补所有创建异步任务的原生 API 来实现这一点。

关于javascript - 在 unhandledrejection 事件处理程序中获取堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62765986/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com