async/await 不自动捕获 Promise rejection,必须用 try/catch 包裹 await 表达式;未捕获的拒绝会报 Uncaught (in promise);fetch 需手动检查 res.ok 并 throw 错误;应避免 forEach 中 await,改用 for…of 或 Promise.all;全局 unhandledrejection 仅作监控兜底。

async/await 本身不会自动捕获 Promise rejection,必须主动设置错误边界——不是代码写得“漂亮”就叫优雅,而是让错误不逃逸、可定位、易响应。
必须用 try/catch 包裹 await 表达式
await 只是把 Promise 的 resolve 值“同步化”,而 reject 会以异常形式向上冒泡。没被 catch 的 await rejection 就是未捕获的 Promise 拒绝,控制台报 Uncaught (in promise)。
- ✅ 正确:await 写在 try 块内,catch 能捕获该 await 抛出的错误(包括网络失败、JSON 解析失败、undefined 调用等)
- ❌ 错误:单独写
await someAsync()不加 try/catch;或把 await 放在 try 外,只包同步逻辑 - ⚠️ 注意:async 函数里
return Promise.reject(...)不会触发外层 catch,必须await它才生效
多个 await 共享一个 try/catch 要谨慎
串行依赖操作(如先取 ID 再查详情)适合共用 try/catch,但所有 await 都落在同一个错误域里,一旦出错无法区分阶段。
- 若需区分错误来源,可在关键 await 后加局部 .catch(),再 resolve 继续链路
- 并行任务(如同时拉用户+订单)建议每个 Promise 单独 .catch() 返回默认值,再用
Promise.all组合,避免一错全停 - 不要在 forEach/map 中 await —— 应改用 for…of 或 Promise.all + map
fetch 等 API 需手动检查状态码
fetch 成功返回 Response 对象,即使 HTTP 状态是 404 或 500 也不会 reject,必须显式判断 res.ok 并 throw。
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`)- 否则后续
await res.json()可能因无效响应体抛错,但错误源头已丢失 - 建议封装统一请求函数,在内部完成状态校验和错误标准化
兜底:全局监听 + 主动降级
unhandledrejection 是最后一道防线,不能替代业务层处理,但可用于监控和告警。
- 浏览器中:
window.addEventListener('unhandledrejection', e => { console.warn('未处理拒绝:', e.reason); }) - Node.js 中:
process.on('unhandledRejection', (reason, promise) => { /* 上报日志 */ }) - 关键路径上建议加统一错误处理器(如 Express 中间件包装 async handler),结合分类错误做重试、fallback 或用户提示

















