Rust 错误处理库
thiserror vs snafu
thiserror
thiserror 是一个轻量级库,提供派生宏使错误定义变得简单。
特点:
- 简洁的语法,低仪式感
- 适合创建错误类型库和 API
- 一般用于创建供他人使用的库
snafu
snafu 提供一个更完整的错误处理框架,重点关注错误上下文和错误链。
特点:
- 以"上下文选择器"模式鼓励更精确地添加错误上下文
- 推荐"每个模块一个错误枚举"的模式
- 支持结构体和元组风格的错误变体
- 内置的回溯支持
比较
选择建议:
- 选择 thiserror 当你需要简单明了的错误类型,尤其是在库中
- 选择 snafu 当你需要更多结构化的错误处理,特别是在大型应用中
anyhow
anyhow 是一个与上述两者不同的错误处理库,它专注于应用程序而非库。
特点:
- 设计用于应用程序的错误处理,而非库
- 提供动态
anyhow::Error类型,可包含任何实现Error特征的错误 - 简化了跨越多个错误类型的处理
- 不需要定义自定义错误类型
anyhow vs thiserror/snafu:
- anyhow 专注于快速开发应用程序时的错误处理
- thiserror/snafu 专注于创建精确的错误类型层次结构
- anyhow 通常用于应用程序代码
- thiserror/snafu 通常用于库代码
在实践中,anyhow 和 thiserror 经常一起使用:库使用 thiserror 定义精确的错误类型,而应用程序使用 anyhow 处理各种错误来源。