优化 async/await 错误提示需分层设计:按 error.name 或 status 区分网络、http、业务错误并差异化提示;注入请求路径、动作等上下文便于追溯;用户提示简洁友好,开发日志保留技术细节;杜绝静默失败,确保 promise 有 await 或 catch。

错误提示信息不是越详细越好,而是要让开发者或用户能快速定位问题、理解影响、知道下一步该做什么。优化 async/await 的错误提示,关键在于分层设计:区分错误类型、补充上下文、控制输出粒度。
明确错误分类,避免笼统的“请求失败”
同一句 catch (error) 捕获的可能是网络中断、接口 404、JSON 解析失败、后端业务错误(如 token 过期),但它们的处理方式和提示语完全不同。
- 用
error.name或response.status判断类型:网络错误(TypeError)、HTTP 错误(response.status >= 400)、业务错误(检查data.code === 401) - 对不同错误给出差异化提示:
– 网络异常 → “网络连接不稳定,请检查 Wi-Fi 或移动数据”
– 401 错误 → “登录已过期,请重新登录”
– 500 错误 → “服务暂时不可用,稍后再试”
注入上下文,让错误可追溯
单靠 error.message 很难还原现场。在抛出或上报前,主动附加关键上下文信息。
- 记录请求路径、参数(脱敏后)、触发动作(如“点击提交按钮时获取订单列表”)
- 示例写法:
console.error('API Error:', error, context);
前端错误监控系统(如 Sentry)能自动采集这些字段,大幅提升排查效率。
区分用户可见提示与开发日志
面向用户的提示必须简洁友好,而开发日志需要完整技术细节 —— 两者不能混用。
- 用户提示建议用统一文案模板,比如:
“加载个人资料失败”(不暴露 URL 或 status) - 开发日志则保留原始 error.stack、response headers、request body(若非敏感)
- 可在 catch 中拆分处理:
showToast('操作未成功,请稍后重试'); // 用户感知
reportErrorToSentry(error, { url, params }); // 开发侧追踪
}
避免静默失败,确保每条 Promise 都有兜底
没被 await 或 catch 的 Promise 会静默 rejected,既不报错也不提示,是线上问题的隐形推手。
- 检查所有异步调用是否被正确 await 或 .catch()
- 对非关键请求(如埋点、统计上报),可用
.catch(() => {})忽略,但需加注释说明意图 - 启用 ESLint 规则
no-promise-reject-without-catch,提前拦截漏网之鱼











