Error handling 从函数返回错误的惯用方法是什么?如果成功,将不会产生结果?

Error handling 从函数返回错误的惯用方法是什么?如果成功,将不会产生结果?,error-handling,rust,optional,idioms,rust-result,Error Handling,Rust,Optional,Idioms,Rust Result,在Rust中,我认为处理可恢复错误的惯用方法是使用Result。例如,此函数显然是惯用的: fn do_work() -> Result<u64, WorkError> {...} fn do_work()->结果{…} 当然,也有一些函数具有单一的、明显的故障状态,因此使用选项类型。一个惯用的例子是: fn do_work() -> Option<u64> fn do_work()->选项 所有这些都在文档中直接提到。然而,我对函数可能失败,但成功时

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

fn do_work() -> Result<u64, WorkError> {...}
fn do_work()->结果{…}
当然,也有一些函数具有单一的、明显的故障状态,因此使用选项类型。一个惯用的例子是:

fn do_work() -> Option<u64>
fn do_work()->选项
所有这些都在文档中直接提到。然而,我对函数可能失败,但成功时没有意义的情况感到困惑。比较以下两个功能:

fn do_work() -> Option<WorkError>
// vs
fn do_work() -> Result<(), WorkError>
fn do_work()->选项
//vs
fn do_work()->结果
我只是不确定其中哪一个更为惯用,或者在现实世界的代码中使用得更频繁。我的参考资料是铁锈书,但我认为它的“”部分没有提到这一点。我也没有太多的运气与任何其他生锈的文件

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

使用
fn do_work()->Result

Result
表示您希望完成工作,但可能会失败

选项
表示您希望得到一个错误,但它可能不存在

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

我希望
选项
仅用于
fn get_last_work_error()->Option

生锈是“非常强类型的”(请不要对我如何衡量一种语言的强类型表示不满…)。我的意思是,Rust通常为您提供了让类型为您“说话”并记录代码的工具,因此使用此功能编写可读代码是惯用的

换句话说,您要问的问题应该是“哪种类型最能代表函数对读取其签名的任何人所做的事情?”

对于
结果
您可以直接看到

结果是表示成功(Ok)或失败(Err)的类型

因此,专门针对您的情况,它意味着您的函数如果成功(由
Ok
表示)或出现错误(
Err
)则不返回任何内容。这是您在问题中描述函数的方式在代码中的非常直接的表示

将其与
选项
选项

Type选项表示一个可选值:每个选项要么是Some,要么包含一个值,要么是None,而不是

在您的情况下,
选项
会对读者说“此函数应该返回一个
工作错误
,但它可能什么也不返回”。您可以记录“不返回任何内容”的情况意味着函数实际上是成功的,但仅从类型来看这一点并不明显


选项
表示“此函数可以不返回任何内容或没有任何有意义的返回”,如果
WorkError
不包含任何其他信息(如错误类型或错误消息),并且实际上这只是表示“已发生错误”的一种方式,则可以合理地说。在这种情况下,一个简单的
bool
携带相同的信息。。。否则,
Result
允许您返回与错误相关的更多信息。

我属于
Result
一方。。我通常也将这些别名作为我自己的类型。我很想听听别人怎么说。我这样做是因为
尝试宏仍然可以很好地使用它。我不认为我不同意,我确实认为结果稍微好一点。然而,我想知道是否有任何“官方”来源以任何方式支持你的答案?@其他人由于
do_work
本身就是一个概念性的例子,我不认为会有任何官方惯例。但是你可以在标准库中了解到这个习惯用法,例如:@Others当一个可能失败的操作没有返回任何有用的结果时,整个标准库普遍使用
Result
(例如,
std::io
std::fs
的许多函数)。这是正确的选择。@其他人,使用
结果
在(根据RFC 236)得到正式认可。@ArtemGr注意,该页中讨论的备选方案将是OP问题上下文中的
选项
,而不是
选项
<前者中的code>None
表示工作做得不好,后者中的
None
表示工作做得不好。