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
# event-unhandledrejection
HTML
# handler-window-onunhandledrejection

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
unhandledrejection event

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
See implementation notes.

参见