async/await错误处理有四种模式:统一try-catch按类型分发、to()封装实现局部容错、Promise.allSettled处理并行部分失败、业务层抽象策略注入,核心是区分处理而非单纯捕获。

async/await 本身不自带错误分发能力,但通过组合结构设计和封装模式,可以避免层层 try-catch、实现按需响应不同错误——关键不在“捕获更多”,而在“区分处理”和“解耦逻辑”。
统一 try-catch + 错误分类判断
适用于串行依赖链中各环节失败需不同响应的场景(如用户登录 → 加载订单 → 获取优惠券)。
- 用单个 try 包裹全部 await,保持代码扁平
- 在 catch 中检查 error 类型或响应状态码,而非只看 message 字符串
- 可配合自定义错误类(如 NetworkError、AuthError、NotFoundError)提升判断可靠性
示例:
async function loadProfile(userId) {try {
const user = await fetchUser(userId);
const orders = await fetchOrders(user.id);
const coupon = await fetchCoupon(orders[0]?.id);
return { user, orders, coupon };
} catch (err) {
if (err instanceof AuthError) redirectLogin();
else if (err.status === 404) showWarning('优惠券暂不可用');
else throw err;
}
}
to() 封装:Go 风格的 [error, data] 元组
适合需要局部容错、部分失败不影响整体流程的场景(如首页多个独立模块数据加载)。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 把每个 await 转为解构赋值:
const [err, data] = await to(promise) - 错误处理紧贴对应操作,不打断主流程缩进
- 函数体里不再出现 try/catch,语义更聚焦
封装方式:
function to(promise) {return promise
.then(data => [null, data])
.catch(error => [error, null]);
}
async function renderHomepage() {
const [userErr, user] = await to(fetchUser());
if (userErr) console.warn('用户信息加载失败,使用缓存');
const [newsErr, news] = await to(fetchNews());
if (newsErr) console.warn('资讯加载失败,跳过渲染');
render({ user: user || cachedUser, news: news || [] });
}
Promise.allSettled + 结果映射
适用于并行请求且允许部分失败的聚合场景(如仪表盘多个统计卡片)。
- 不用 Promise.all(一错全崩),改用 Promise.allSettled 返回固定长度数组
- 每个结果含 status('fulfilled'/'rejected')和 value/reason,可逐项处理
- 避免为每个请求单独写 await + to(),批量更简洁
示例:
async function loadDashboard() {const results = await Promise.allSettled([
fetchSales(),
fetchUsers(),
fetchErrors()
]);
const [salesRes, usersRes, errorsRes] = results;
const sales = salesRes.status === 'fulfilled' ? salesRes.value : null;
const users = usersRes.status === 'fulfilled' ? usersRes.value : [];
const errors = errorsRes.status === 'fulfilled' ? errorsRes.value : [];
return { sales, users, errors };
}
业务层抽象:错误策略注入
适合中大型项目,将错误响应逻辑从组件/服务中剥离,提升复用性。
- 定义错误策略对象,如 { 401: 'redirect', 403: 'toast', 500: 'retry' }
- 封装通用 fetch 函数,自动根据响应状态码触发对应策略
- 调用方只关注成功路径,失败由策略中心统一调度
简化调用:
async function loadData() {// 不再手动 catch,错误已由 fetchWithPolicy 处理
const user = await fetchWithPolicy('/api/user');
const profile = await fetchWithPolicy(`/api/profile/${user.id}`);
return { user, profile };
}

















