我有一些代码,其中 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 包装在我的代码中。
提前非常感谢:)
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
是的!但不能通过自己构建和调度
ErrorEvent来实现。相反,您可以使用reportError:window.onunhandledrejection = event => { reportError(event.reason); }; window.onerror = (...args) => { console.log('onerror', args); }; (async function() { throw new Error("oops"); }());