unhandledrejection之Promise異常捕獲

Promise 被 reject 且沒有 reject 處理器的時候,會觸發 unhandledrejection 事件;這可能發生在 window 下,但也可能發生在 Worker 中。 這對於調試回退錯誤處理非常有用。

是否冒泡 No
是否可取消 Yes
接口 PromiseRejectionEvent
事件處理器屬性 onunhandledrejection (en-US)

使用備註

unhandledrejection 繼承自 PromiseRejectionEvent,而 PromiseRejectionEvent 又繼承自 Event。因此unhandledrejection 含有 PromiseRejectionEvent  Event 的屬性和方法。

例子

Here we have a few examples showing ways you can make use of the unhandledrejection event. The event includes two useful pieces of information:

我們將通過幾個例子來展示 unhandledrejection 事件的使用方式。該事件主要包含兩部分有用的信息:

promise

The actual Promise which was rejected with no handler available to deal with the rejection.

特定的 Promise 被 reject 而沒有被相應的異常處理方法所處理時

reason

The reason that would have been passed into the rejection handler if one had existed. See catch() for details.

將會傳入異常處理方法中的錯誤原因(如果存在),查看 catch() 相關以獲取更多細節。

基本的異常上報

此示例只是將有關未處理的 Promise rejection 信息打印到控制檯。

window.addEventListener("unhandledrejection", event => {
  console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
});
Copy to Clipboard

您還可以使用 onunhandledrejection (en-US) 事件處理程序屬性來設置事件偵聽器:

window.onunhandledrejection = event => {
  console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
};
Copy to Clipboard

防止默認處理

許多環境(例如 Node.js ) 默認情況下會向控制檯打印未處理的 Promise rejections。您可以通過添加一個處理程序來防止 unhandledrejection 這種情況的發生,該處理程序除了您希望執行的任何其他任務之外,還可以調用 preventDefault() 來取消該事件,從而防止該事件冒泡並由運行時的日誌代碼處理。這種方法之所以有效,是因爲 unhandledrejection 是可以取消的。

window.addEventListener('unhandledrejection', function (event) {
  // ...您的代碼可以處理未處理的拒絕...

  // 防止默認處理(例如將錯誤輸出到控制檯)

  event.preventDefault();
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章