--- title: unhandledrejection slug: Web/Events/unhandledrejection tags: - API - JavaScript - Promise - unhandledrejection - 事件 - 参考 translation_of: Web/API/Window/unhandledrejection_event ---
{{APIRef("HTML DOM")}}

当{{jsxref("Promise")}} 被 reject 且没有 reject 处理器的时候,会触发 unhandledrejection 事件;这可能发生在 {{domxref("window")}} 下,但也可能发生在 {{domxref("Worker")}} 中。 这对于调试回退错误处理非常有用。

是否冒泡 No
是否可取消 Yes
接口 {{domxref("PromiseRejectionEvent")}}
事件处理器属性 {{domxref("WindowEventHandlers.onunhandledrejection", "onunhandledrejection")}}

使用备注

unhandledrejection 继承自 {{domxref("PromiseRejectionEvent")}},而 {{domxref("PromiseRejectionEvent")}} 又继承自 {{domxref("Event")}}。因此unhandledrejection 含有 PromiseRejectionEventEvent 的属性和方法。

例子

Here we have a few examples showing ways you can make use of the unhandledrejection event. The event includes two useful pieces of information:

我们将通过几个例子来展示 unhandledrejection 事件的使用方式。该事件主要包含两部分有用的信息:

promise
The actual {{jsxref("Promise")}} which was rejected with no handler available to deal with the rejection.
特定的 {{jsxref("Promise")}} 被 reject 而没有被相应的异常处理方法所处理时
reason
The reason that would have been passed into the rejection handler if one had existed. See {{jsxref("Promise.catch", "catch()")}} for details.
将会传入异常处理方法中的错误原因(如果存在),查看 {{jsxref("Promise.catch", "catch()")}} 相关以获取更多细节。

基本的异常上报

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

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

您还可以使用 {{domxref("WindowEventHandlers.onunhandledrejection", "onunhandledrejection")}} 事件处理程序属性来设置事件侦听器:

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

防止默认处理

许多环境(例如 {{Glossary("Node.js")}} ) 默认情况下会向控制台打印未处理的 Promise rejections。您可以通过添加一个处理程序来防止 unhandledrejection 这种情况的发生,该处理程序除了您希望执行的任何其他任务之外,还可以调用 {{domxref("Event.preventDefault()", "preventDefault()")}} 来取消该事件,从而防止该事件冒泡并由运行时的日志代码处理。这种方法之所以有效,是因为 unhandledrejection 是可以取消的。

window.addEventListener('unhandledrejection', function (event) {
  // ...您的代码可以处理未处理的拒绝...

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

  event.preventDefault();
});

说明

Specification Status Comment
{{SpecName('HTML WHATWG', 'webappapis.html#unhandled-promise-rejections', 'unhandledrejection')}} {{Spec2('HTML WHATWG')}} Initial definition.

浏览器兼容性

{{Compat("api.Window.unhandledrejection_event")}}

参考

[1] The corresponding event handler property is defined on the {{domxref("WindowEventHandlers")}} mixin, which is available on both the {{domxref("Window")}} interface and all types of {{domxref("Worker")}} interfaces.