搜索

首页  >  问答  >  正文

获取 PromiseRejectionEvent 的位置信息

我有一些代码,其中 async 函数可能会抛出错误,我正在使用 unhandledrejection 事件处理它们,因为那些未捕获的 throw 不会触发 error 事件,因为它们发生在 Promise 内。因此,我的错误处理程序正在获取 PromiseRejectionEvent 而不是 ErrorEvent

到目前为止,一切顺利,错误处理工作正常。

但是我这里有一个小问题,那就是 PromiseRejectionEvent 事件缺少位置信息,与 ErrorEvent 事件不同,将位置放入引发错误的代码中将非常有用.

当代码未使用 async 函数,并且处理程序获取 ErrorEvent 事件时,需要使用 event.filenameevent.linenoevent.colno,但 PromiseRejectionEventphpcnend 中缺少这些cphpcn活动。

SO 我的问题是:我可以以任何方式包装 PromiseRejectionEvent 并重新分派它,以便最终我有一个带有位置信息的 ErrorEvent 吗?

我尝试过这样的事情:

bigFunctionWithAllTheCodeIncludingAsyncFunctions()
.catch(error => {
    const errorEvent = new ErrorEvent('unhandledrejection', {
            'error': error,
    });
    window.dispatchEvent(errorEvent);
});

上面的代码生成了一个正确的 ErrorEvent 以及相关的错误信息但是所有位置信息都是无用的(0 表示行和列,'' 表示文件名)。

顺便说一句,我已经检查了在 unhandledrejection 事件处理程序中获取堆栈跟踪,但目前我无法使用自定义类将 Promise 包装在我的代码中。

提前非常感谢:)

P粉447785031P粉447785031316 天前528

全部回复(1)我来回复

  • P粉835428659

    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"); }());

    回复
    0
  • 取消回复