在JavaScript的异步编程场景中,Promise被大量使用,但如果Promise的状态变为拒绝后没有被对应的catch方法或者then的第二个回调处理,就会产生未处理的Promise拒绝。这类错误如果不捕获,在部分环境下可能会被忽略,导致问题难以排查,因此需要掌握对应的捕获方法。

浏览器环境下的捕获方式
浏览器环境中可以通过监听unhandledrejection事件来捕获未处理的Promise拒绝,这个事件会在Promise被拒绝且没有对应的拒绝处理器时触发。我们可以在全局作用域中绑定这个事件,统一处理所有未被捕获的Promise错误。
示例代码如下:
// 监听未处理的Promise拒绝事件
window.addEventListener('unhandledrejection', function(event) {
// 阻止默认行为,避免浏览器在控制台输出错误信息
event.preventDefault();
// 获取拒绝的原因,可能是错误对象或者普通值
const reason = event.reason;
console.log('捕获到未处理的Promise拒绝,原因:', reason);
// 这里可以添加错误上报、日志记录等逻辑
});
// 测试未处理的Promise拒绝
new Promise((resolve, reject) => {
reject(new Error('测试未处理的Promise错误'));
});Node.js环境下的捕获方式
Node.js环境中同样提供了对应的事件机制,通过监听process对象的unhandledRejection事件,可以捕获到未处理的Promise拒绝。这个事件的回调函数会接收到两个参数,分别是拒绝的原因和对应的Promise实例。
示例代码如下:
// 监听Node.js环境的未处理Promise拒绝事件
process.on('unhandledRejection', (reason, promise) => {
console.log('捕获到未处理的Promise拒绝,原因:', reason);
console.log('对应的Promise实例:', promise);
// 可以添加自定义的处理逻辑,比如错误上报
});
// 测试未处理的Promise拒绝
new Promise((resolve, reject) => {
reject('Node.js环境下的未处理Promise错误');
});注意事项
使用上述方法捕获未处理的Promise拒绝时,需要注意以下几点:
- 捕获到错误后,建议先记录错误详情,方便后续排查问题,不要直接忽略错误。
- 如果已经为Promise添加了对应的catch处理,就不会触发未处理拒绝的监听事件,因此不需要担心重复处理。
- 部分旧版本浏览器可能不支持
unhandledrejection事件,如果需要兼容旧环境,可以提前确认环境支持情况。 - 在Node.js中,如果未监听
unhandledRejection事件,默认会在控制台输出错误信息,并且可能导致进程退出,因此建议在生产环境中添加对应的监听逻辑。
补充:已处理的拒绝恢复监听
除了未处理的拒绝事件,浏览器还提供了rejectionhandled事件,当之前未被处理的Promise拒绝后来被处理了(比如添加了catch回调),就会触发这个事件,开发者可以根据需要选择是否监听。
示例代码如下:
window.addEventListener('rejectionhandled', function(event) {
console.log('之前未处理的Promise拒绝已被处理,对应的Promise:', event.promise);
});
// 先创建一个未处理的Promise
const p = new Promise((resolve, reject) => {
reject('待处理的错误');
});
// 延迟添加catch处理,触发rejectionhandled事件
setTimeout(() => {
p.catch(err => {
console.log('处理错误:', err);
});
}, 1000);
Promiseunhandled_rejectionwindowprocess事件监听修改时间:2026-06-07 03:10:38