主要观点:设计 Rust 中的错误类型需考虑诸多因素,包括库与二进制 crate 的区别、thiserror
的使用及与#[from]
结合、以std::io::Error
为参考等,不同情况应选择不同设计方式。
关键信息:
- 库中设计错误类型要考虑公共 API 及与其他错误类型的交互,有使用
thiserror
和自定义错误类型两种主要方式。 - 使用
thiserror
与#[from]
易导致内部错误类型泄漏,可通过将内部错误类型装箱为特质对象或定义自己的包装类型来解决。 std::io::Error
设计中,ErrorKind
枚举表示不同错误种类,Custom
结构体封装自定义错误类型,通过Boxed trait object
处理内部错误类型。
重要细节:- 对于二进制 crate,通常使用
anyhow
或eyre
处理错误,除非需在代码中匹配或记录错误方式不同才设计自定义错误类型。 - 以
std::io::Error
为参考的设计中,Repr
枚举用于表示错误的不同表示形式,ErrorKind
枚举可添加新错误种类而不破坏现有代码,整个设计具有未来可扩展性。 - 选择使用
thiserror
与#[from]
还是自定义错误类型取决于具体使用情况,可混合使用,若不想引入依赖可采用类似std::io::Error
的自定义错误类型,但需更多手动实现工作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。