promise 统一管理异步错误的核心是将错误视为可预期返回值,通过明确责任边界、分类错误类型、强制错误出口和组合式流程设计实现可靠异常处理。

用 Promise 统一管理异步错误,核心在于把错误当作“可预期的返回值”来设计,而不是靠运气捕获。关键不是堆砌 catch,而是建立一致的状态流转路径和错误边界。
明确每个 Promise 的责任边界
每个 Promise 应该只对自己内部逻辑负责,不掩盖、不吞掉错误,也不越界处理上游或下游的异常。
- 网络请求 Promise:封装 fetch 或 axios 调用,对 HTTP 状态码做标准化判断(如 4xx/5xx → reject),并附带原始响应信息
- 业务逻辑 Promise:接收上层数据后执行校验、转换等操作,出错时 reject 带结构化错误对象(例如
{ code: 'INVALID_INPUT', message: '邮箱格式不正确' }) - 组合型 Promise(如
Promise.all):根据场景决定是否容错——需要全成功就用原生all;允许部分失败就改用Promise.allSettled或手动包装
统一错误类型与分类处理
避免用裸 Error 或字符串 throw,定义可识别的错误层级,让上层能按类型分流响应。
- 定义基础错误类,比如
ApiError(含 status、url)、ValidationError(含字段名)、NetworkError(含超时标识) - 在 Promise 链首层(如 API 封装层)就把原始异常映射为具体子类:
if (err.name === 'AbortError') throw new NetworkError('请求被取消', { cause: 'abort' }) - 组件或业务层通过
error instanceof ApiError或error.code === 'NOT_FOUND'做差异化反馈(弹提示 / 跳登录 / 显示空白页)
强制错误出口,杜绝静默失败
借助工具链确保每个 Promise 都有明确的错误归宿,不依赖开发者自觉。
- 启用 ESLint 插件
eslint-plugin-promise,开启promise/catch-or-return规则,未 catch 或未 return 的 Promise 直接报错 - 对 async 函数统一加兜底
try/catch,并在catch中至少记录日志:console.error('Unhandled promise rejection:', error) - 全局监听未捕获的 Promise 拒绝:
window.addEventListener('unhandledrejection', e => { logToMonitor(e.reason); e.preventDefault(); })
用组合模式替代深层嵌套
深层 .then().then().catch() 容易漏掉中间环节的错误,应转为扁平链式或函数组合。
- 优先使用
async/await + try/catch,错误位置清晰,堆栈完整 - 多个独立请求用
Promise.allSettled替代Promise.all,返回每个结果的状态对象,便于逐个分析失败原因 - 复杂流程可用状态容器(如 Vue Promised 的
Promised组件或 ts-results 的Result类型),把 success/error 变成显式分支,编译期就能检查是否全覆盖











