在 async/await 中,try catch 可直接捕获 await 触发的 Promise rejection,但 await 必须位于 try 内且函数需为 async;多个 await 可共用一个 try,条件分支须全覆盖,避免漏写;不可混用 .catch(),且仅捕获当前 async 函数内 await 的异常。

在 async/await 中,用 try catch 捕获异常和同步代码逻辑一致:把可能出错的 await 表达式放在 try 块里,错误会以异常形式被 catch 捕获,不需要额外处理 Promise 的 reject 状态。
基本写法:await 必须在 try 内部
await 只能在 async 函数中使用,而错误捕获依赖于 try catch 结构包裹 await 调用。如果 await 写在 try 外,一旦 rejected 就会直接抛出未捕获异常(Uncaught Promise rejection)。
- ✅ 正确:await 在 try 中,reject 被 catch 拦截
- ❌ 错误:await 在 try 外,或整个 async 函数没被 try 包裹
常见错误场景与修复
容易忽略的是“多个 await”或“条件分支中漏写 try”,导致部分异步操作失去错误控制。
- 多个 await 不必每个都套 try,一个 try 可覆盖多个 await(按顺序执行,遇到第一个 reject 就跳出)
- if/else 或循环中调用 await,需确保所有分支都在 try 内,或各自加 try(视错误隔离需求而定)
- 不要对 await 的结果再用 .catch() —— 这会干扰 try catch 流程,造成重复处理或遗漏
和 Promise.catch 对比更直观
下面两段逻辑等价,但 async/await + try catch 更接近同步写法,可读性更强:
立即学习“Java免费学习笔记(深入)”;
// Promise 链写法fetch('/api/user').then(res => res.json()).catch(err => console.error(err));
// async/await 写法
try {
const res = await fetch('/api/user');
const data = await res.json();
} catch (err) {
console.error(err);
}
注意:try catch 不捕获同步错误以外的 Promise rejection
它只捕获当前 async 函数内、由 await 触发的 Promise rejection。以下情况不会被捕获:
- setTimeout 或 setInterval 中抛出的错误
- 未 await 的 Promise(例如忘了写 await,直接赋值给变量)
- 事件回调(如 onclick、onload)中发生的错误
这些仍需各自内部 try catch,或通过 window.onerror / unhandledrejection 监听全局异常。


















