async函数错误处理需按错误性质匹配模式:关键操作用try/catch中断流程,并行任务用.catch()或promise.allsettled()独立容错,全局加unhandledrejection监听兜底,再封装to()工具函数统一降级。

async 函数内错误处理不是“选一种就行”,而是要根据错误的性质、影响范围和业务目标来匹配模式。核心原则是:**该中断时果断中断,该兜底时主动兜底,该隔离时彼此独立**。
单个关键操作:用 try/catch 集中捕获
当某次请求失败意味着后续逻辑无意义(比如登录态校验、权限获取、主数据加载),就该用 try/catch 包裹整个 await 链。它能清晰表达“这一步出错,整段流程终止”的语义。
- 适合场景:用户登录、支付确认、表单提交等不可降级的关键路径
- 注意点:catch 中别只 console.error,要明确返回值(如 throw error 继续向上抛,或 return null / defaultObj 让调用方决定是否继续)
- 避免陷阱:不要在 try 块里 return 一个被 reject 的 Promise(如 return fetch(...).catch(...)),那会绕过 catch;应写成 return await fetch(...).catch(...)
多个并行任务:用 .catch() 或 Promise.allSettled() 独立容错
当几个请求互不依赖(比如同时拉取用户信息、通知列表、配置项),一个失败不该拖垮全部,这时就不该共用一个 try/catch。
- 推荐做法:为每个 await 表达式单独加 .catch(),返回默认值(null / [] / {}),再统一 await Promise.all([...])
- 更简洁方式:直接用 Promise.allSettled(),它不会因某个失败而中断,返回每个 Promise 的 { status, value | reason } 结构,逻辑更可控
- 慎用 Promise.all():它只要有一个 reject 就整体失败,除非你明确需要“全成功才继续”
统一兜底 + 全局监控:防止错误静默丢失
局部处理再细,也难免遗漏。浏览器和 Node.js 都提供全局钩子,这是最后一道防线。
- 必加监听:
window.addEventListener('unhandledrejection', event => { /* 上报错误、提示用户 */ }) - 作用:捕获所有没被 .catch() 或 try/catch 捕获的 Promise reject,避免“页面没反应、控制台没报错”的调试噩梦
- 配合使用:
window.onerror捕获同步错误和资源加载失败,两者一起构成基础防护网
封装工具函数:降低重复成本
如果项目中大量出现“await xxx().catch(() => null)”,说明可以抽象了。类似 to.js 的模式值得引入:
- 定义一个
to(promise)工具函数,返回[error, result]数组 - 调用时写成
const [err, data] = await to(fetch('/api/user')),语义清晰且不易漏处理 - 优势:消除重复的 .catch 回调,避免忘记 return 默认值,也方便后续统一加日志或重试逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











