Skip to main content

lang-error-is-value

📅 2026-03-31 ✏️ 2026-03-31 CS
No related notes

1 · lang-error#

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

错误处理有两大流派:

  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编译期穷举
传播手动returnif err != nil样板?语法糖try语法糖
组合无机制%w/errors.Join灵活需手动转换,繁琐||合并,轻松
信息仅整数,贫乏任意类型,最丰富任意类型,丰富仅名字,贫乏
恢复if (err) { 默认值 }if err != nilunwrap_orcatch