我有一些代码,其中 async
函数可能会抛出错误,我正在使用 unhandledrejection
事件处理它们,因为那些未捕获的 throw
不会触发 error
事件,因为它们发生在 Promise
内。因此,我的错误处理程序正在获取 PromiseRejectionEvent
而不是 ErrorEvent
。
到目前为止,一切顺利,错误处理工作正常。
但是我这里有一个小问题,那就是 PromiseRejectionEvent
事件缺少位置信息,与 ErrorEvent
事件不同,将位置放入引发错误的代码中将非常有用.
当代码未使用 async
函数,并且处理程序获取 ErrorEvent
事件时,需要使用 event.filename
、event.lineno
和 event.colno
,但 PromiseRejectionEventphpcnend 中缺少这些cphpcn活动。
SO 我的问题是:我可以以任何方式包装 PromiseRejectionEvent
并重新分派它,以便最终我有一个带有位置信息的 ErrorEvent
吗?
我尝试过这样的事情:
bigFunctionWithAllTheCodeIncludingAsyncFunctions() .catch(error => { const errorEvent = new ErrorEvent('unhandledrejection', { 'error': error, }); window.dispatchEvent(errorEvent); });
上面的代码生成了一个正确的 ErrorEvent
以及相关的错误信息但是所有位置信息都是无用的(0
表示行和列,'' 表示文件名)。
顺便说一句,我已经检查了在 unhandledrejection 事件处理程序中获取堆栈跟踪,但目前我无法使用自定义类将 Promise 包装在我的代码中。
提前非常感谢:)
P粉8354286592024-02-18 10:48:20
是的!但不能通过自己构建和调度 ErrorEvent
来实现。相反,您可以使用 reportError
:
window.onunhandledrejection = event => { reportError(event.reason); }; window.onerror = (...args) => { console.log('onerror', args); }; (async function() { throw new Error("oops"); }());