Effect Error Handling 是一项面向 Effect 应用的类型安全错误处理技能,重点围绕预期错误、错误恢复、选择性错误处理与错误转换展开。
用途 用于在 Effect 应用中以类型安全的方式处理预期错误,包括失败恢复、回退逻辑、瞬时失败重试、跨层错误转换、在不中断执行的情况下记录错误、实现应用级错误边界、针对不同错误类型分别处理、将错误转换为 Option 或 Either、累积校验错误,以及构建有韧性的错误恢复系统。
主要能力
- 区分预期错误与缺陷:预期错误是可恢复的、记录在类型系统中的错误(E 通道);缺陷是意外失败(bug、编程错误)。资料给出使用 Effect.fail 表示预期错误、Effect.try 包裹可能抛错代码的示例。
- 带标签错误类型:用带 _tag 的联合类型定义错误,以支持模式匹配(如 NotFoundError、UnauthorizedError、NetworkError,并组成 AppError)。
- 捕获全部错误:Effect.catchAll 捕获所有预期错误并提供回退,可将错误通道变为 never,也可回退到另一个 effect。
- 选择性错误处理:Effect.catchTag 按 _tag 捕获特定错误;Effect.catchTags 一次处理多个错误类型并可配不同恢复策略;Effect.catchIf 按谓词条件捕获;Effect.catchSome 部分处理并可选返回 Option.none() 让错误继续传播。
- 错误转换:Effect.either 转为 Either<Success, Error> 并可用 Either.match 模式匹配;Effect.option 将失败转为 None、成功转为 Some,可配合 Option.match 使用。
- 错误变换与副作用:Effect.mapError 转换错误类型或添加上下文;Effect.tapError 在错误发生时执行副作用但不改变错误本身,之后错误继续传播。
- 重试与回退:Effect.orElse 提供失败时的备选 effect,可多级回退;Effect.retry 配合 Schedule 实现重试,如 Schedule.recurs(3)、指数退避 Schedule.exponential("100 millis", 2.0),也可用 while 条件只重试特定错误。
- 组合多个处理器:可链式使用多个 catchTag 再用 catchAll 兜底未知错误。
- 错误累积:用 Effect.all 的 { mode: "either" } 不因首个错误短路,收集所有校验错误后统一失败。
- 处理缺陷:Effect.catchAllCause 同时处理错误与缺陷(含中断);Effect.sandbox 将缺陷暴露到错误通道以便处理。
使用方式 资料以 TypeScript 代码示例展示各操作符用法,通常通过 Effect.gen 生成器或 pipe 管道组合:catchTag、catchTags、catchIf、catchSome 做选择性恢复,either / option 做边界转换,mapError / tapError 做变换与记录,orElse / retry 做回退与重试,catchAllCause / sandbox 处理缺陷。
适用场景 需要类型安全地处理预期错误、用回退逻辑从失败恢复、为瞬时失败实现重试策略、在不同层之间转换错误、记录错误但不中断执行、实现错误边界、针对不同错误类型差异化处理、将错误转换为 Option 或 Either、累积校验错误、构建韧性恢复系统时。
限制与注意事项 资料给出最佳实践:使用带标签错误类型、保持错误类型具体、在靠近源头处处理、优先用 catchTag 而非 catchAll、在边界处转换、捕获前先用 tapError 记录、不要吞掉错误、只重试瞬时失败、随传播丰富错误上下文、记录每个函数可能产生的错误。常见陷阱包括:到处使用 catchAll 掩盖错误类型、不给错误打标签、吞掉错误、无限重试、丢失错误信息、不处理缺陷、错误边界位置不当、过早类型拓宽、忽略错误通道、只测试正常路径。相关资料还列出官方文档主题(错误管理、预期错误、意外错误、错误通道操作、回退、重试、沙箱)与相关技能(effect-core-patterns、effect-testing)。具体版本要求、安装方式与平台支持暂未提供。