unhandledrejection

Promise 被 reject 且没有 reject 处理器的时候,会触发 unhandledrejection 事件;这可能发生在 window 下,但也可能发生在 Worker 中。这对于调试和为意外情况提供后备错误处理非常有用。

是否冒泡 No
是否可取消 Yes
接口 PromiseRejectionEvent
事件处理器属性 onunhandledrejection

事件属性

unhandledrejection 继承自 PromiseRejectionEvent,而 PromiseRejectionEvent 又继承自 Event。因此unhandledrejection 含有 PromiseRejectionEventEvent 的属性和方法。主要包含两个有用的属性:

promise

特定的被 reject 且没有 reject 处理器的 Promise

reason

将会传入异常处理方法中的错误原因(如果存在),查看 catch() 相关以获取更多细节。

使用说明

允许 unhandlejection 事件冒泡将最终导致向控制台输出错误消息。可以通过调用 PromiseRejectionEvent 上的 preventDefault() 来阻止这种情况;请参阅下面的阻止默认处理示例。

例子

我们将通过几个例子来展示 unhandledrejection 事件的使用方式。

基本的异常上报

此示例只是将有关未处理的 Promise rejection 信息打印到控制台。

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 rejections。你可以通过为 unhandledrejection 事件添加一个处理程序来避免这种情况的发生,该处理程序除了执行你希望执行的任何其他任务之外,还可以调用 preventDefault() 来取消该事件,从而阻止该事件冒泡并由运行时的日志代码处理。这种方法之所以有效,是因为 unhandledrejection 事件是可以取消的。

js
window.addEventListener("unhandledrejection", function (event) {
  // ...你的代码可以处理未处理的 rejection...

  // 阻止默认处理(例如将错误输出到控制台)

  event.preventDefault();
});

规范

Specification
HTML Standard
# event-unhandledrejection
HTML Standard
# handler-window-onunhandledrejection

浏览器兼容性

BCD tables only load in the browser

参见