在 async 函数中,try catch 是捕获异步错误最直接的方式,可统一拦截 promise 拒绝或抛出异常;需包裹每个可能出错的 await,区分错误类型并针对性处理,避免空 catch,结合 finally 做清理工作。

在 async 函数中,try catch 是捕获异步错误最直接、最常用的方式。它能让你把 Promise 拒绝(reject)或抛出的异常(throw)统一拦截,避免未处理的 rejection 导致程序崩溃或静默失败。
捕获 await 表达式中的错误
await 后面如果是被 reject 的 Promise,会直接触发 catch 块;如果 await 后是普通值或 resolve 的 Promise,则不会进入 catch。
- 确保每个可能出错的 await 调用都包裹在 try 中,尤其是 API 请求、文件读写、数据库操作等外部依赖
- 不要只在函数最外层加一层 try catch——多个 await 应该共用一个 try catch 块,除非你需要对不同步骤做差异化错误处理
- 示例:await fetch('/api/data') 失败时会立即跳进 catch,无需额外 .catch()
区分不同错误类型并针对性处理
实际项目中,网络超时、权限不足、数据格式错误等需要不同响应。可以在 catch 中判断 error 类型或状态码再分支处理。
- 检查 error.name(如 'TypeError'、'AbortError')、error.status(HTTP 状态码)、或自定义 error.code
- 对网络错误可重试,对 401 错误可跳转登录页,对 404 可提示资源不存在
- 避免笼统地 console.error(error),应记录关键上下文(如请求 URL、参数)便于排查
避免“吞掉”错误或忽略 rejected promise
空 catch 块(catch {})或只 console.log 却不抛出/返回兜底值,会让调用方无法感知失败,引发后续逻辑错乱。
- catch 中应明确返回默认值(如空数组、null)、抛出新错误(throw new Error(...))、或调用回调通知上层
- 若函数声明为 async,即使 catch 里 return,函数仍返回 fulfilled Promise —— 调用方需按正常流程处理返回值
- 注意:未 await 的 Promise 若被 reject 且无 .catch(),会触发 unhandledrejection,即便外层有 try catch 也捕获不到
结合 finally 做清理工作
无论成功或失败都需要执行的操作(如关闭加载态、释放锁、清除定时器),适合放在 finally 块中。
- finally 不接收 error 参数,也不影响返回值,纯粹用于副作用清理
- 与 try/catch 配合使用,能保证逻辑完整性,比如 loading = false 总是执行
- 注意:finally 中抛出错误会覆盖 try 或 catch 中的错误,慎用 throw











