在 Rust 中的错误处理

主要观点:当前编写 crate 时错误处理的标准是每个模块定义一个错误枚举或整个 crate 定义一个涵盖所有可能产生错误情况的枚举,公共函数返回Result时使用该错误枚举,但这样会导致函数返回包含其不能产生的错误变体的枚举,且需手动区分哪些变体在当前范围不适用。
关键信息:Rust 本应通过类型系统表达需求防止违规却创建了大的错误枚举;有替代方案,如terrors用结构体表示错误而非枚举变体,虽需写.map_err(OneOf::broaden)等较麻烦但仍喜欢;还有error_set库用宏定义不同函数的错误枚举并自动生成转换特性实现,?运算符在特定条件下可工作;还有其他探索此范式的库如SmartErr等。
重要细节:error_set示例中展示了如何定义各种错误集及它们之间的关系;提到曾见过一个可通过属性宏根据函数体中出现的错误生成错误枚举并插入返回类型的 crate 但未找到。

阅读 13
0 条评论