Window: unhandledrejection 事件

当一个没有拒绝处理程序的 JavaScript Promise 被拒绝时,unhandledrejection 事件将发送到脚本的全局范围;通常情况下,它是 window,但也可能是 Worker

这对于调试和为意外情况提供后备错误处理很有用。

语法

addEventListener() 等方法中使用事件名称,或设置事件处理程序属性。

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

事件类型

事件属性

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

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅