Designing Error Types in Rust Libraries
a year ago
- #Error Handling
- #Rust
- #Library Design
- 在Rust库中设计错误类型需要仔细考虑,特别是对于公共API。
- 二进制包通常使用anyhow或eyre等crate处理错误,侧重于用户提示信息。
- 库crate需要精心设计错误类型,因为它们会成为公共API的一部分。
- 库错误类型的两种主要方法:使用thiserror crate或类似std::io::Error的自定义错误类型。
- thiserror能减少样板代码,并通过#[from]实现其他错误类型到自定义错误的转换。
- 避免暴露内部错误类型(如sqlx::Error),防止库用户被迫引入不必要的依赖。
- 解决方案:使用Box<dyn std::error::Error + Send + Sync>封装内部错误,保持API灵活性。
- std::io::Error是优秀参考范例,其ErrorKind枚举和不透明的错误处理方式值得借鉴。
- std::io::Error的关键特性包括非穷尽枚举、装箱特征对象和简洁的公共API设计。
- 根据库的使用场景和公共API需求,在thiserror(配合装箱)和自定义错误类型间做选择。