lang-error-is-value
No related notes
Outlinks (0)
No outlinks found
Backlinks (0)
No backlinks found
1 · lang-error#
错误是值。错误是类型系统的一部分,不可被静默忽略。
错误处理有两大流派:
- 异常流派(Java、Python、C#、JavaScript):错误是隐藏的控制流,通过
throw抛出、try/catch捕获;错误路径不体现在函数签名中,调用方可以完全不知道会抛什么异常,遗漏catch只有运行时才会暴露。 - 值流派(C、Go、Rust、Zig):错误是普通的返回值,错误路径体现在函数签名中,调用方必须显式处理。
以下四个语言都在践行”错误是个值”的哲学,但建模方式不同:
由此导致各操作的取舍不同:
| C(错误码) | Go(接口) | Rust(enum) | Zig(集合) | |
|---|---|---|---|---|
| 穷举 | ❌ 无保证 | ❌ 编译器无法保证 | ✅ match编译期穷举 | ✅ switch编译期穷举 |
| 传播 | 手动return | if err != nil样板 | ?语法糖 | try语法糖 |
| 组合 | 无机制 | %w/errors.Join灵活 | 需手动转换,繁琐 | ||合并,轻松 |
| 信息 | 仅整数,贫乏 | 任意类型,最丰富 | 任意类型,丰富 | 仅名字,贫乏 |
| 恢复 | if (err) { 默认值 } | if err != nil | unwrap_or | catch |