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

浏览器兼容性

另见