主要观点:异常比将错误作为值返回更适合处理错误,传统异常能提供更好的用户和开发者体验,且执行更快。
关键信息:
- 传统面向对象编程语言用特殊异常类处理错误,如 C++ 现在在标准库中加入了错误值
std::expected
。 - 新语言倾向于函数式错误报告,如 Go 用
(res, err)
元组,Rust 返回Result<T, E>
。 - 作者认为函数式错误处理代码并不比异常处理更好,Rust 中
unwrap
调用过多。 - 对于服务器端代码,异常能轻松处理错误并向客户端发送错误消息,而不是关闭整个系统。
- 异常处理代码比函数式错误处理代码更简洁,如 CockroachDB 有近 25k 个错误处理路径,而 CedarDB 仅 140 个。
- 大多数程序处理的错误比应处理的少,异常能处理系统错误,如内存分配失败等,而 Go 的 GC 对此帮助不大,Rust 正在改进。
- 错误返回值的错误消息往往信息少且糟糕,而异常能更好地提供错误原因上下文。
- 异常在成功时无开销,错误返回值会引入额外检查和分支开销,性能更差,如 C++和 Rust 的对比。
- 过去异常执行慢是因为实现质量问题,现在已改变,且 libgcc 已实现无锁解栈,但解栈仍比必要的更昂贵。
重要细节: - 以
safeDiv
函数为例展示了不同语言的错误处理方式。 - 详细说明了异常和函数式错误处理在代码量、性能、错误消息等方面的差异。
- 提及了 libgcc 解栈的相关问题及改进措施。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。