用途:这是一份代码评审视角的约定,用于判断某个失败应建模为 Result<T, E> 还是 throw。仓库约定是:可恢复、可预期的失败返回 Result;不可恢复的缺陷才抛出异常。
主要能力:给出判断标准与需标记的模式。判断时问:失败是否属于函数正常契约(validate、parse、find、fetch and decode、schema 匹配等应返回 Result);调用方是否可能想分支处理、重试、降级或累积问题(是则用 Result,只能记录并终止则抛出);是否为程序无法继续推理的破坏性不变量(应抛出);失败是否跨越大量调用栈(Result 显式但冗长,跨十层是噪音税)。
需标记的模式:为输入校验新增 throw;用 try/catch 加 instanceof 分支处理预期错误;throw 表示“未找到”;只有名称和消息、无行为的错误类;同一路径混用 Result 与 throw;Result 的错误类型为 Error 或 unknown。可接受的情况:bin/、CLI 入口或顶层处理器中程序确实无法继续时抛出;穷尽 switch 的 default 中抛 unreachable;函数无法恢复的 I/O 错误;二元“找到/未找到”返回 T | undefined。
使用方式:使用项目 src/result.ts 中的 Result<T, E>,例如 import { type Result, ok, err } from "../result.js";,并优先使用窄字符串字面量或标签联合的 E 形状,而非不透明的 Error 对象。参考实现见 src/apply/validate.ts,其中 validate 返回 Result<ValidationOk, string[]>,使 CLI 无需 try/catch 即可格式化问题并以退出码 1 结束。
限制:资料未提供该约定的强制工具、自动检查或跨语言适配说明。