try...catch 可统一捕获 async/await 中的同步错误和 await 的 Promise reject 错误,但未 await 的 Promise 错误会丢失;需确保所有需处理的异步调用都显式 await 或手动 .catch()。

在 async/await 中,try...catch 可以统一捕获同步错误和 被 await 的 Promise 被 reject 时的异步错误,但前提是:错误必须发生在 await 表达式内部或其等待的 Promise 链中;而 await 外部、未被 await 的 Promise(如直接调用但不 await 的异步函数)抛出的错误,不会进入当前 try 块。
✅ 正确捕获:await 后的 Promise reject
只要用 await 等待一个会 reject 的 Promise,该 reject 就会被 catch 捕获,表现得像同步异常一样:
说明: await 会把 Promise 的 rejection 自动转为 throw,因此能被同步的 catch 捕获。
-
fetch('/api')失败(网络错误、404、500)→ 返回 rejected Promise →await触发 throw →catch捕获 -
await Promise.reject(new Error('Oops'))→ 直接被捕获 - async 函数内部
throw错误 → 函数返回 rejected Promise →await后被 catch
⚠️ 容易遗漏:未 await 的 Promise 错误(即“幽灵错误”)
如果调用一个 async 函数但没加 await,它返回的 Promise 若被 reject,就**不会触发当前 try...catch**,而是变成未处理的 Promise rejection(控制台报错,可能崩溃):
示例:
async function risky() { throw new Error('Lost!'); }
try {
risky(); // ❌ 没 await → 错误丢失,不进 catch
} catch (e) {
console.log('Never reached');
}
建议: 所有需要错误处理的异步调用,必须显式 await;否则应手动 .catch() 或确保上层兜底。
? 混合同步与异步错误:同一 try 块完全适用
async 函数体内的同步代码(如 JSON.parse、类型错误、空值访问)和 await 异步错误,都可被同一个 try...catch 捕获:
-
JSON.parse('{invalid}')→ 同步 SyntaxError → 进 catch -
const data = await fetch(...); const json = await data.json();→data.json()reject(如响应非 JSON)→ 进 catch - 两者写在一起,无需区分处理逻辑
? 进阶技巧:避免 try...catch 嵌套过深
多个 await 可共用一个 try 块,但若需对不同步骤做差异化错误处理,可:
- 拆分为多个独立的 try...catch(适合步骤间无强依赖)
- 在 catch 中检查 error 类型或 message(如区分网络错误 vs 业务错误)
- 用辅助函数封装 await + catch 逻辑,返回 { data, error } 元组(类似 Go 风格)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











