我有一些代碼,其中 async
函數(shù)可能會拋出錯誤,我正在使用 unhandledrejection
事件處理它們,因為那些未捕獲的 throw
不會觸發(fā) error
事件,因為它們發(fā)生在 Promise
內(nèi)。因此,我的錯誤處理程序正在獲取 PromiseRejectionEvent
而不是 ErrorEvent
。
到目前為止,一切順利,錯誤處理工作正常。
但是我這里有一個小問題,那就是 PromiseRejectionEvent
事件缺少位置信息,與 ErrorEvent
事件不同,將位置放入引發(fā)錯誤的代碼中將非常有用.
當(dāng)代碼未使用 async
函數(shù),并且處理程序獲取 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
以及相關(guān)的錯誤信息但是所有位置信息都是無用的(0
表示行和列,'' 表示文件名)。
順便說一句,我已經(jīng)檢查了在 unhandledrejection 事件處理程序中獲取堆棧跟蹤,但目前我無法使用自定義類將 Promise 包裝在我的代碼中。
提前非常感謝:)
是的!但不能通過自己構(gòu)建和調(diào)度 ErrorEvent
來實現(xiàn)。相反,您可以使用 reportError
:
window.onunhandledrejection = event => { reportError(event.reason); }; window.onerror = (...args) => { console.log('onerror', args); }; (async function() { throw new Error("oops"); }());