promise.reject()需被try/catch包裹或链式.catch()处理,否则触发unhandledrejection;await不捕获错误,仅转拒绝为异常;裸return promise.reject()无法被外层捕获,应改用throw或显式await;全局监听仅作兜底监控。

直接在 await 后面接 Promise.reject(),若没被 try/catch 包裹,就会触发 unhandledrejection——这不是“bug”,而是 Promise 拒绝未被消费的自然表现。防止的关键不是绕开它,而是让拒绝有明确归属。
必须用 try/catch 包住每个 await 表达式
await 本身不捕获错误,只是把 Promise 的拒绝转为可抛异常;只有放在 try 块里,才能进 catch。
- ✅ 正确写法:
async function getUser() {<br> try {<br> const res = await Promise.reject(new Error('network failed'));<br> return res;<br> } catch (err) {<br> console.error('处理失败:', err.message);<br> return null;<br> }<br> } - ❌ 错误写法:
async function getUser() {<br> const res = await Promise.reject(new Error('network failed')); // 没 try/catch → 触发 unhandledrejection<br> return res;<br> } - ⚠️ 注意:
Promise.reject()不等于throw,它返回一个已拒绝的 Promise;await是让它“浮出水面”的必要动作
避免在 async 函数里裸 return Promise.reject()
如果函数内部直接 return Promise.reject(...),外层 try/catch 无法捕获——因为这不是抛出,而是返回一个 rejected Promise。
- ✅ 改成
throw new Error(...),这样能被外层try/catch捕获 - ✅ 或者显式
await Promise.reject(...),再包在try/catch里 - ❌ 不要写:
return Promise.reject(new Error('xxx'))(调用方不 await 或不 catch 就彻底漏掉)
对“发射即忘”型 Promise 显式加 .catch()
有些场景不需要等结果(比如上报、日志),但不能放任拒绝无人处理。
- ✅ 正确:
reportError(err).catch(() => {});或reportError(err).catch(console.warn); - ❌ 错误:
reportError(err);—— 拒绝后无监听,立刻进unhandledrejection - ⚠️ 注意:这种写法不能靠外层
try/catch捕获,必须链末尾有.catch()
全局监听只做兜底和可观测,不用于逻辑恢复
unhandledrejection 是最后一道防线,不是容错主逻辑。
- 浏览器中尽早注册:
window.addEventListener('unhandledrejection', e => {<br> e.preventDefault(); // 可选,屏蔽控制台默认警告<br> reportToMonitor(e.reason); // 上报错误原因,含堆栈、URL、用户 ID 等上下文<br> }); - Node.js 中必须监听:
process.on('unhandledRejection', (reason, promise) => {<br> process.exitCode = 0; // 防止 v15+ 默认退出进程<br> logError(reason);<br> }); - ⚠️ 切记:这个事件拿不到完整调用栈,也不能恢复业务流程,只适合发现遗漏、补全监控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











