要捕获未处理的 promise reject,需监听全局 unhandledrejection 事件:浏览器在 window 上、node.js 在 process 上;同时应主动用 .catch() 或 try/catch 显式处理,辅以 eslint 等工具预防。

JavaScript 中 Promise 的未处理 rejection(未捕获的 reject)不会自动抛出错误,容易静默失败。要捕获它,核心是监听全局事件 unhandledrejection。
监听 unhandledrejection 事件
浏览器和 Node.js(v15+)都支持 unhandledrejection 全局事件,它在 Promise 被 reject 且**没有绑定任何 .catch() 或 await 处理时**触发。
- 浏览器中可在
window上监听 - Node.js 中在
process上监听
示例(浏览器):
<script><br> window.addEventListener('unhandledrejection', event => {<br> console.error('未处理的 Promise reject:', event.reason);<br> event.preventDefault(); // 阻止默认控制台警告(可选)<br> });<br> <br> Promise.reject('出错了'); // 触发 unhandledrejection<br> </script>Node.js 中的等效处理
Node.js 使用 process.on('unhandledRejection'),注意大小写:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
console.error('未处理的 Promise 拒绝:', reason);
// 可记录日志、上报监控、或 process.exit(1) 终止进程(谨慎)
});
⚠️ 注意:Node.js 默认会在未处理时打印警告并可能退出(v15+ 启用 --unhandled-rejections=throw 会直接抛异常)。
避免依赖全局监听:主动处理更可靠
全局监听只是兜底,真正健壮的做法是在代码中显式处理每个可能 reject 的 Promise:
- 使用
.catch()显式捕获链末尾 -
async/await中用try/catch - 对所有
Promise.all()等组合操作,考虑包裹或单独处理每个子 Promise
反例(会触发 unhandledrejection):
fetch('/api').then(res => res.json()); // 缺少 catch
正例:
fetch('/api')
.then(res => res.json())
.catch(err => console.error('请求失败:', err));
开发阶段辅助工具
一些工具能提前发现潜在问题:
- ESLint 插件如
eslint-plugin-promise提供promise/catch-or-return规则,强制要求 Promise 链有 catch 或 return - TypeScript 编译器无法检测 reject,但配合 linter 和单元测试可提升覆盖率
这类工具不能替代运行时监听,但能显著减少漏掉 catch 的概率。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










