Hasty Briefsbeta

双语

Trying to get error backtraces in Rust libraries right

9 months ago
  • #Error Handling
  • #Rust
  • #Backtraces
  • Rust的错误处理主要分为两种方式:`anyhow`适用于带回溯的通用错误,`thiserror`适用于基于枚举的精确错误。
  • 标准库的IO错误模型提供了第三种方案,将错误分为种类(kind)和来源(source),兼顾高层级匹配和详细上下文。
  • Rust的回溯传播功能尚不稳定,会导致嵌套错误问题,需要在易用性和回溯支持之间做出权衡。
  • `snafu`是混合解决方案,结合`thiserror`的枚举错误与回溯捕获和上下文附加功能,解决了部分局限性。
  • `iroh`项目在公共API中使用`snafu`实现结构化错误并保留调试信息,测试时使用`n0-snafu`提升编写体验。
  • 错误处理指南建议:将枚举范围限定在函数内、使用描述性命名、为公共trait提供自定义变体。
  • 需要权衡利弊:结构化错误需要更多前期工作但能提供稳定API,而通用错误实现更快。
  • Rust社区鼓励库使用结构化错误,但实际选择应优先考虑项目需求而非教条主义。