lang-error

2026-03-312026-03-313 出链

错误是值。错误是类型系统的一部分,不可被静默忽略。

错误处理有两大流派:

  1. 异常流派(Java、Python、C#、JavaScript):错误是隐藏的控制流,通过throw抛出、try/catch捕获;错误路径不体现在函数签名中,调用方可以完全不知道会抛什么异常,遗漏catch只有运行时才会暴露。
  2. 值流派(C、Go、Rust、Zig):错误是普通的返回值,错误路径体现在函数签名中,调用方必须显式处理。

以下四个语言都在践行"错误是个值"的哲学,但建模方式不同:

  1. C:错误是返回的整数错误码
  2. Go:错误是满足error接口的类型
  3. Rust:错误是库类型Result<T,E>(enum)
  4. Zig:错误是内建的error set集合

由此导致各操作的取舍不同:

C(错误码) Go(接口) Rust(enum) Zig(集合)
穷举 ❌ 无保证 ❌ 编译器无法保证 match编译期穷举 switch编译期穷举
传播 手动return if err != nil样板 ?语法糖 try语法糖
组合 无机制 %w/errors.Join灵活 需手动转换,繁琐 ||合并,轻松
信息 仅整数,贫乏 任意类型,最丰富 任意类型,丰富 仅名字,贫乏
恢复 if (err) { 默认值 } if err != nil unwrap_or catch

评论