异常转换是将原始错误统一转为结构化业务错误对象,通过try/catch重抛自定义错误、封装await工具函数、在promise链中提前转换,并建立语义清晰的错误分类体系。

在 async/await 模式下,异常转换的核心是把底层抛出的原始错误(比如网络错误、类型错误、Promise rejection)统一转换为业务可识别、可处理的结构化错误对象,而不是让原始堆栈或不明确的 message 直接暴露给上层逻辑。
用 try/catch 捕获并重抛自定义错误
async 函数内部的 await 表达式一旦 rejected,会直接触发 catch 块。这是转换异常最直接的位置:
- 在 catch 中检查 error 类型(如 instanceof TypeError、error.status === 401),再 new 一个业务错误类(如 ApiError、AuthError)
- 保留原始 error 的 stack 和 cause(ES2022+ 支持),便于调试时追溯根源
- 避免只改 message 而忽略原错误,否则丢失上下文
封装通用的 await 包装函数
重复写 try/catch 容易冗余,可抽象一层工具函数,自动完成“执行 + 错误转换”:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 接收一个 Promise 和一个转换函数(error => BusinessError),返回 Promise
- 适用于 API 调用、文件读取等高频异步操作,让调用方决定是否立即处理错误
- 示例:const [data, err] = await to(fetch('/api/user')); // 类似 Go 的错误处理风格
在 Promise 链中提前转换 reject
如果异步操作来自第三方库(如 axios、fs.promises),可在 then/catch 或 .catch() 中提前转换:
- axios:用 interceptors.response.use(null, error => Promise.reject(new ApiError(error)))
- fetch:在 await fetch(...) 后立刻检查 response.ok,手动 throw new HttpError(response.status)
- 关键点是“在错误传播到顶层 await 前完成转换”,避免多层 catch 嵌套
统一错误分类与状态码映射
真正有用的异常转换,不只是换一个构造函数,而是建立语义清晰的错误体系:
- 定义 Error 子类(如 ValidationError、NetworkError、PermissionDeniedError),各自有 code、status、hint 字段
- 后端返回 400 → ValidationError;503 → NetworkError;403 → PermissionDeniedError
- 前端组件或 hooks 根据 error.code 决策:弹提示、跳登录页、重试、静默忽略










