async/await 配合 try...catch 是处理异步错误最清晰的方式:将 await 表达式置于 try 块中,统一在 catch 中处理错误,支持多步依赖流程、类型化错误判断,并需避免静默丢失错误等常见陷阱。

在 JavaScript 中,用 async/await 配合 try...catch 是处理异步错误最清晰、最接近同步逻辑的方式。关键在于把可能抛错的异步操作放在 try 块里,统一在 catch 中处理,避免嵌套和重复的 .catch()。
基本结构:一个 try catch 包住 await 表达式
这是最常用也最推荐的写法:
async function fetchData() {
try {
const response = await fetch('/api/data');
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
return data;
} catch (error) {
console.error('获取数据失败:', error.message);
// 可以返回默认值、重试、或重新抛出
throw error; // 或 return null;
}
}
多个 await 操作共享同一套错误处理
多个连续异步步骤(如请求 → 解析 → 存储)可以共用一个 try...catch,逻辑更紧凑:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 只要其中任意一步 reject 或 throw,都会立刻跳进
catch - 不用为每个
await单独写.catch(),减少样板代码 - 适合有依赖关系的流程(后一步依赖前一步结果)
需要分别处理不同错误?用条件判断细化 catch
如果想对网络错误、解析错误、业务错误做不同响应,可以在 catch 里判断错误类型:
立即学习“Java免费学习笔记(深入)”;
try {
const res = await fetch(url);
if (!res.ok) throw new NetworkError(res.status);
const json = await res.json();
if (json.code !== 0) throw new BizError(json.message);
return json.data;
} catch (err) {
if (err instanceof NetworkError) {
showNetworkTip();
} else if (err instanceof BizError) {
showToast(err.message);
} else {
reportUnknownError(err);
}
}
避免常见陷阱
-
不要在 await 外面直接调用 async 函数却不处理 Promise:比如
fetchData()忘了await或.catch(),错误会静默丢失 -
不要在循环中无等待地并发多个 await:想并发请用
Promise.all([p1, p2]),再await它,否则变成串行 -
catch 捕获的是 Promise rejection 和 throw 的错误:语法错误、同步异常(如
JSON.parse('invalid'))也会被捕捉,这点比纯 Promise 链更直观
这种写法让异步流程像同步代码一样可读、可调试、易维护。核心就是:await 放 try 里,错误逻辑集中收口在 catch 中。

















