Hasty Briefsbeta

双语

Stop Forwarding Errors, Start Designing Them

4 months ago
  • #rust
  • #error-handling
  • #debugging
  • 当前错误处理实践往往只是转发错误而不保留有意义的上下文。
  • Rust的`std::error::Error`特性存在缺陷,它假设错误是线性链式的,排除了多源错误的场景。
  • 异步代码中的回溯信息通常无用且昂贵,无法展示错误的逻辑路径。
  • `Provide/Request` API引入了不可预测性和复杂性,却未带来明确收益。
  • `thiserror`按错误来源而非可操作的响应分类错误,导致恢复逻辑不清晰。
  • `anyhow`过于便利,常导致错过添加上下文的机会。
  • 错误设计应兼顾两类受众:机器(用于自动恢复)和人类(用于调试)。
  • 对机器而言,错误应是扁平化、可操作且基于类型的,以支持明确决策。
  • 对人类而言,错误应能自动且符合人体工学地捕获丰富上下文。
  • `exn`库通过类型系统在模块边界强制上下文,展示了更优方案。
  • 将机器可读错误与人类可读上下文结合,可实现两全其美。
  • 错误本质是沟通工具,应精心设计而非简单转发。