async/await 配合 try-catch 是处理异步错误最直观的方式,需将 await 置于 try 块内以捕获 Promise reject 转换的同步错误;一个 try-catch 可包裹多个逻辑相关的 await,错误需显式 re-throw 以防被吞掉,finally 用于统一收尾清理。

async/await 配合 try-catch 是 JavaScript 中处理异步错误最直观、最接近同步代码风格的方式,关键在于把 await 放在 try 块内,让异常能被 catch 捕获,而不是抛到 Promise 链外。
await 必须在 try 内部调用
await 本身不会自动捕获错误,它只是“暂停”执行并等待 Promise 结果。如果 Promise 被 reject,await 会把 rejection 转为同步抛出的错误——但这个错误只有在 try 块中才能被 catch 捕获。
- ✅ 正确:await 写在 try 中,reject 自动转成 throw,catch 可捕获
- ❌ 错误:await 在 try 外,Promise reject 会变成未处理的 rejected promise,触发 unhandledrejection 事件
单个 await 就够,不用每个都包 try-catch
一个 try-catch 可以包裹多个 await,只要它们逻辑上属于同一业务流程,失败时应统一处理(比如展示同一个错误提示)。
- 例如:先 fetch 用户数据,再 fetch 订单列表,两个请求都失败时显示“加载失败”,那就共用一个 try-catch
- 如果第二个请求失败不影响第一个结果展示(比如用户头像加载失败但资料要显示),才考虑单独 try-catch 或 .catch(() => {}) 降级处理
注意:不要在 catch 里漏掉 re-throw
如果你只是记录日志或做 UI 提示,但后续逻辑仍需知道出错了(比如上层函数要根据错误类型跳转页面),记得在 catch 里手动 throw error 或 return Promise.reject(error)。
立即学习“Java免费学习笔记(深入)”;
- 否则错误会被“吞掉”,调用方无法感知失败
- 常见写法:throw error; 或 throw new Error(`API failed: ${error.message}`);
可选:配合 finally 做收尾清理
无论成功或失败都需要执行的操作(如关闭 loading 状态、释放资源),放在 finally 里最稳妥。
- loading = false; 应该放 finally,而不是只放 try 或只放 catch
- finally 不接收参数,也不影响 error 的传播,是真正的“无论如何都执行”


















