Window: unhandledrejection 事件

當一個沒有拒絕處理程式的 JavaScript Promise 被拒絕時,unhandledrejection 事件會被髮送到指令碼的全域性作用域;通常是 window,但也可能是 Worker

這對於除錯和為意外情況提供備用錯誤處理非常有用。

語法

在諸如 addEventListener() 之類的方法中使用事件名稱,或設定事件處理程式屬性。

js
addEventListener("unhandledrejection", (event) => { })

onunhandledrejection = (event) => { }

事件型別

一個 PromiseRejectionEvent。繼承自 Event

Event PromiseRejectionEvent

事件屬性

PromiseRejectionEvent.promise 只讀

被拒絕的 JavaScript Promise

PromiseRejectionEvent.reason 只讀

一個值或 Object,指示 Promise 被拒絕的原因,與傳遞給 Promise.reject() 的值相同。

事件處理程式別名

除了 Window 介面之外,事件處理程式屬性 onunhandledrejection 也可在以下目標上使用

用法說明

允許 unhandledrejection 事件冒泡最終會導致錯誤訊息輸出到控制檯。你可以透過在 PromiseRejectionEvent 上呼叫 preventDefault() 來阻止這種情況發生;請參閱下面的阻止預設處理以獲取示例。

由於此事件可能會洩露資料,因此源自跨域指令碼的 Promise 拒絕不會觸發此事件。

示例

基本錯誤日誌記錄

此示例將有關未處理的 Promise 拒絕的資訊記錄到控制檯。

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

你也可以使用 onunhandledrejection 事件處理程式屬性來設定事件監聽器

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

阻止預設處理

許多環境(例如 Node.js)預設會將未處理的 Promise 拒絕報告到控制檯。你可以透過為 unhandledrejection 事件新增處理程式來阻止這種情況發生,該處理程式除了執行你希望執行的任何其他任務之外,還會呼叫 preventDefault() 來取消事件,從而阻止其冒泡到執行時日誌記錄程式碼進行處理。這是因為 unhandledrejection 是可取消的。

js
window.addEventListener("unhandledrejection", (event) => {
  // code for handling the unhandled rejection
  // …

  // Prevent the default handling (such as outputting the
  // error to the console)

  event.preventDefault();
});

規範

規範
HTML
# event-unhandledrejection
HTML
# handler-window-onunhandledrejection

瀏覽器相容性

另見