async函数需主动设计错误处理:区分可恢复业务错误(如超时、401)与不可恢复逻辑错误(如typeerror),前者提供ui反馈与重试,后者必须暴露;用try/catch分类捕获、fetch二次校验、promise.allsettled处理并行请求、safeawait统一包装、unhandledrejection兜底,并确保loading与error状态同步更新。

async 函数本身不携带状态,错误响应和状态反馈需要靠开发者主动设计。核心原则是:区分可恢复业务错误(如网络超时、接口返回 401)和不可恢复逻辑错误(如调用 undefined 方法),前者应提供用户可见反馈与重试路径,后者必须暴露以便修复。
用 try/catch 捕获并分类错误
每个 async 函数内部建议包裹 try/catch,但不要只做 console.error。重点是判断错误性质:
- 检查 error.name 或 error.message 是否含 "timeout"、"Failed to fetch"、"401" 等关键词,归为业务错误,触发 UI 提示 + 重试按钮
- 遇到 TypeError、ReferenceError 或未预期的 error.stack 包含 "undefined is not a function",基本是代码 bug,不应静默吞掉,可上报监控并保留原始错误抛出
- 对 fetch 响应需二次校验:await response.json() 成功不代表业务成功,要检查 data.code === 0 或 response.ok,否则 throw new Error(`业务失败: ${data.msg}`)
并行请求中的独立错误处理
Promise.all 会因任一 Promise reject 而整体失败,不适合“部分成功”场景。若需用户看到全部结果(哪怕某些失败),改用 Promise.allSettled:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它返回每个 Promise 的 { status, value/reason },便于逐个渲染状态(如“用户数据 ✅,订单数据 ❌ 请重试”)
- 配合 map + await 处理数组时,避免在 forEach 中直接 await —— 它无法捕获异常,应改用 for...of 或 Promise.all([...map()])
统一包装安全执行层
高频重复的错误处理逻辑可抽成工具函数,例如 safeAwait:
- 接收一个 Promise 和可选 fallback 值,返回 [error, result] 元组,类似 Go 的错误风格
- 调用时写法变为 const [err, data] = await safeAwait(fetch('/api/user')); if (err) { /* 显示 err.message */ }
- 比层层 try/catch 更轻量,也避免了错误被意外忽略
补充全局兜底与用户感知
再完善的局部处理也无法覆盖所有遗漏点,需两层兜底:
- 监听 unhandledrejection 事件,捕获未被 catch 的 Promise reject,用于日志上报或显示“未知错误,请刷新页面”
- 所有异步操作启动时设置 loading 状态,结束时无论成功失败都清除;失败时同步更新 error 状态字段,让 UI 可响应式显示提示或重试控件
- 不要让用户面对空白页或无响应按钮——哪怕只是显示“加载中…”或“稍后重试”,也是关键的状态反馈
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










