JS await 异常捕获类
· 4 min read
JavaScript 异步异常处理 三 种姿势,try/catch 嵌套地狱 最常见也最糟糕。
- try/catch 包 await:层层嵌套,业务和错误处理混成一坨
- .catch() 链式:返回 undefined 难以判断错误来源
- 元组解构
[err, data]:Go 风格,推荐
封装一个 to(promise) 工具函数,10 行代码消灭所有 try/catch,错误处理变成一行 if (err) return。
关键:业务错误用元组、致命错误仍要抛,别用工具类把所有异常都吞掉。
问题:try/catch 把代码切成稀碎
写 async/await 的人都遇过这种代码:
async function getUserOrders(uid) {
let user;
try {
user = await fetchUser(uid);
} catch (e) {
console.error('fetch user failed', e);
return null;
}
let orders;
try {
orders = await fetchOrders(user.id);
} catch (e) {
console.error('fetch orders failed', e);
return null;
}
return { user, orders };
}
20 行代码,业务逻辑只占 3 行,剩下全是异常处理样板。函数一多,整个项目就被 try/catch 切成稀碎。