未捕获的 Promise 拒绝警告源于 Promise 被 reject 后未在微任务清空前被 catch 或 then 的失败回调处理,引擎遂触发 unhandledrejection 事件。

Promise 没有被 catch 或 then(null, rejectHandler) 处理拒绝(rejected)状态时,JavaScript 引擎会在当前事件循环结束后、微任务队列清空后,触发 unhandledrejection 事件——这会表现为浏览器控制台的“未捕获的 Promise 拒绝”警告(或 Node.js 中的 UnhandledPromiseRejectionWarning)。
为什么没写 catch 就会报未捕获异常警告
因为 Promise 的错误处理是异步且延迟的:即使你写了 promise.then(...) 但没写第二个参数(失败回调),或者用了 async/await 却没用 try/catch,一旦 Promise 被 reject,又没有在微任务阶段被任何 handler 捕获,运行时就认为这个错误“无人接手”。此时引擎会等所有微任务执行完,再检查该 rejection 是否仍无处理者,若是,则派发 unhandledrejection 事件。
常见触发场景
-
fetch('/api').then(res => res.json())—— 如果网络失败或 JSON 解析出错,then第一个参数不处理 reject,就会告警 -
async function foo() { await Promise.reject('oops'); }调用后未用try/catch包裹 -
Promise.resolve().then(() => { throw new Error('boom'); })—— 在then中抛出异常,但没后续catch -
new Promise((_, reject) => reject('error'))创建后完全没接任何处理链
如何避免或正确响应这类警告
不是要屏蔽警告,而是主动处理或声明“我已知悉”。推荐方式:
- 始终为
then提供失败回调:promise.then(success, fail) - 在
async/await外层加try/catch,或在调用处用.catch() - 全局兜底监听(仅用于日志或降级,不能替代具体处理):
<script><br> window.addEventListener('unhandledrejection', event => {<br> console.warn('未处理的 Promise 拒绝:', event.reason);<br> event.preventDefault(); // 阻止默认警告(仅开发期慎用)<br> });<br> </script> - Node.js 中可通过
process.on('unhandledRejection', ...)类似处理,但 v15+ 默认会终止进程,务必监听
注意:.catch() 必须连在链上才有效
下面写法无效:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
const p = Promise.reject('err');<br>
p.catch(console.error); // ✅ 这样可以<br>
// 但<br>
Promise.reject('err');<br>
.catch(console.error); // ❌ 语法错误,且没链到原 promise
正确链式写法:Promise.reject('err').catch(console.error) 或赋值后立即链:const p = Promise.reject('err'); p.catch(...)。










