async/await需主动捕获错误,优化方向包括:区分错误类型处理、避免嵌套try/catch、封装通用逻辑(如safeFetch或to函数)、用finally清理副作用。

async/await 本身不自动做错误检查,它只是让异步代码写得像同步一样——但错误仍需你主动捕获和判断。优化错误检查的关键不是“多抓几次”,而是更早识别问题、更准定位原因、更少重复逻辑。以下是几个实用方向:
明确区分错误类型再处理
不是所有错误都该用同一个 `catch` 消化。网络失败、数据格式错误、业务校验失败,处理方式完全不同。 - 检查 `error.name` 或 `error.status`(如 fetch 的 `response.status`) - 对 `TypeError`(解析失败)、`AbortError`(请求取消)、`NetworkError` 等做分支响应 - 示例: ```js try { const res = await fetch('/api/user'); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json(); if (!data.id) throw new Error('Invalid response: missing id'); return data; } catch (err) { if (err.name === 'AbortError') console.warn('Request cancelled'); else if (err.message.includes('HTTP')) console.error('Server error:', err.message); else console.error('Data error:', err.message); } ```避免层层 try/catch 嵌套
多个 await 不代表必须每个都包一层 try/catch。把相关操作聚合成一个逻辑单元,统一兜底更清晰。 - 同一业务步骤(如“拉取 → 解析 → 校验”)放在一个 try 块里 - 不同步骤(如“登录”和“加载首页数据”)可分块处理,避免一个失败全链中断 - 若需独立容错,用 `.catch()` 分离: ```js const userPromise = fetch('/api/user').then(r => r.json()); const configPromise = fetch('/api/config').then(r => r.json());// 单独处理,互不影响 userPromise.catch(err => console.warn('User load failed, using default')); configPromise.catch(err => console.warn('Config load failed, skip theme'));
const [user, config] = await Promise.all([userPromise, configPromise]);
<H3>用封装函数减少样板代码</H3>
把通用判断逻辑抽出来,比如“是否是网络错误”“是否要重试”“是否返回默认值”。
- 写一个 `safeFetch` 工具函数,内置状态码判断和 JSON 解析容错
- 或用 `to()` 模式(Go 风格)把 Promise 转成 `[err, data]` 元组:
```js
const to = promise => promise.then(data => [null, data]).catch(err => [err, null]);
async function loadProfile() {
const [err, profile] = await to(fetch('/me').then(r => r.json()));
if (err) return { error: true, message: 'Failed to load profile' };
return { ...profile, loaded: true };
}


















