为什么我更喜欢异常而不是错误值

主要观点:异常比将错误作为值返回更适合处理错误,传统异常能提供更好的用户和开发者体验,且执行更快。
关键信息

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