async函数内部错误捕获需用try/catch,因await将执行流同步化,外部.catch()无法捕获函数体内异常;fetch后须检查res.ok以区分网络失败与http错误;多个await默认串行,独立任务应promise.all并发;catch需分类处理而非泛化吞掉。

async 函数内部错误捕获看似简单,实则容易踩坑。核心问题在于:开发者常把 await 当作“同步语句”,误以为外部 .catch() 能兜住所有错误,或忽略 Promise 拒绝与同步异常的本质差异。
误区一:只靠外层 .catch(),不写 try/catch
这是最普遍的错误。async 函数返回 Promise,但 await 后续语句(如 res.json())抛出的异常,并不会自动进入外层 Promise 链的 .catch() —— 因为 await 已将执行流“同步化”,错误发生在函数体内,必须由函数内部的 try/catch 捕获。
- ❌ 错误写法:
fetchData().catch(...),而fetchData内部无try/catch - ✅ 正确做法:每个含
await的逻辑块都应包裹在try中,尤其注意response.json()、JSON.parse()等可能抛出同步异常的操作
误区二:混淆 fetch 的“网络失败”和“HTTP 错误”
fetch 只在网络完全不可达或请求被阻止时才 reject;404、500 等 HTTP 状态码仍会返回 Response 对象,且 ok === false。若不手动检查,后续 await res.json() 会成功执行,但业务逻辑可能基于错误数据运行。
- ❌ 忽略
if (!res.ok) throw new Error(...) - ✅ 在
await fetch()后立即判断res.ok,主动 reject 或抛出业务错误
误区三:多个 await 串行却误以为是并发
连续写 await a(); await b(); await c(); 是严格串行的,b 必须等 a 完成,c 等 b 完成。这不仅慢,还放大单点失败影响——a 失败,b 和 c 根本不执行。
- ❌ 把“语法上用了 await”等同于“自动并发”
- ✅ 若任务相互独立,应先发起所有 Promise(如
const p1 = a(); const p2 = b();),再用await Promise.all([p1, p2])并发等待
误区四:空 catch 或泛化处理,掩盖真实问题
写 catch (e) { console.log(e); } 看似稳妥,实则丢失错误上下文。TypeError(变量未定义)、SyntaxError(JSON 解析失败)、NetworkError(fetch 失败)性质完全不同,统一吞掉会导致 bug 难以定位。
- ❌
catch块里不做类型判断、不区分可恢复/不可恢复错误 - ✅ 使用
instanceof或error.name分类处理:业务错误可 fallback,代码错误应上报并保留堆栈
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











