在Rust中,我认为处理可恢复错误的惯用方法是使用Result。例如,此功能显然是惯用的:

fn do_work() -> Result<u64, WorkError> {...}

当然,也有一些功能具有单一的,明显的故障状态,因此可以使用Option类型。一个惯用的例子是这样的:
fn do_work() -> Option<u64>

所有这些都可以在文档中直接解决。但是,我对函数可能失败但成功时没有任何意义的情况感到困惑。比较以下两个功能:
fn do_work() -> Option<WorkError>
// vs
fn do_work() -> Result<(), WorkError>

我只是不确定其中哪一个更符合习惯,或者在现实世界的Rust代码中使用得更频繁。我的类似问题的引用资源是Rust书籍,但我认为在“Error Handling”部分中未解决此问题。我对其他Rust文档也没有多大运气。

当然,这似乎是很主观的,但是我正在寻找权威性的资料,这些资料要么陈述哪种形式是惯用的,要么说明为什么一种形式优于(或低于)另一种形式。 (我也很好奇公约与其他大量使用“错误作为值(value)”的语言(例如Go和Haskell)相比。)

最佳答案

使用fn do_work() -> Result<(), WorkError>
Result<(), WorkError>表示您希望完成工作,但是可能会失败。
Option<WorkError>表示您想得到一个错误,但是可能不存在。

您可能希望完成工作,但在编写do_work()时不出错,因此Result<(), WorkError>是更好的选择。

我希望Option<WorkError>仅在类似fn get_last_work_error() -> Option<WorkError>的情况下使用。

10-01 19:54