如果成功,return 函数出错但没有结果的惯用方法是什么?
What is the idiomatic way to return an error from a function with no result if successful?
在 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 文档也不太满意。
当然这看起来很主观,但我正在寻找权威来源,说明哪种形式是惯用的,或者为什么一种形式优于(或低于)另一种形式。 (我也很好奇该约定与其他大量使用 "errors as values" 的语言相比如何,例如 Go 和 Haskell。)
使用fn do_work() -> Result<(), WorkError>
.
Result<(), WorkError>
表示您希望工作完成,但可能会失败。
Option<WorkError>
表示你想得到一个错误,但它可能不存在。
您可能希望完成工作但在编写 do_work()
时不想出错,因此 Result<(), WorkError>
是更好的选择。
我希望 Option<WorkError>
仅在 fn get_last_work_error() -> Option<WorkError>
.
这样的情况下使用
Rust 是 "pretty strongly typed"(拜托,请不要指责我如何衡量语言的强类型......)。我的意思是 Rust 通常为您提供工具来让类型 "speak" 并记录您的代码,因此使用此功能编写可读代码是惯用的。
换句话说,你问的问题应该更"which type represents best what the function does to anyone who reads its signature?"
对于Result<(), Workerror>
你可以直接看到from the docs
Result is a type that represents either success (Ok) or failure (Err)
所以,专门针对你的情况,这意味着你的函数 return 如果成功(由 Ok<()>
表示)或 WorkError
如果有错误(Err<WorkError>
).这是您在问题中描述函数的方式的非常直接的代码表示。
将此与 Option<WorkError>
或 Option<()>
进行比较
Type Option represents an optional value: every Option is either Some and contains a value or None, and does not
在你的情况下 Option<WorkError>
将对 reader "this function should return a WorkError
but it may return nothing" 说。您可以记录 "return nothing" 情况意味着该函数实际上是成功的,但仅从类型来看并不是很明显。
Option<()>
表示 "this function can return nothing or have no meaningful return",如果 WorkError
不包含其他信息(如错误类型或错误消息)并且它实际上只是一个怎么说 "an error has occurred"。在这种情况下,一个简单的 bool
携带相同的信息......否则 Result
可以让你 return 一些与错误相关的更多信息。
在 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 文档也不太满意。
当然这看起来很主观,但我正在寻找权威来源,说明哪种形式是惯用的,或者为什么一种形式优于(或低于)另一种形式。 (我也很好奇该约定与其他大量使用 "errors as values" 的语言相比如何,例如 Go 和 Haskell。)
使用fn do_work() -> Result<(), WorkError>
.
Result<(), WorkError>
表示您希望工作完成,但可能会失败。
Option<WorkError>
表示你想得到一个错误,但它可能不存在。
您可能希望完成工作但在编写 do_work()
时不想出错,因此 Result<(), WorkError>
是更好的选择。
我希望 Option<WorkError>
仅在 fn get_last_work_error() -> Option<WorkError>
.
Rust 是 "pretty strongly typed"(拜托,请不要指责我如何衡量语言的强类型......)。我的意思是 Rust 通常为您提供工具来让类型 "speak" 并记录您的代码,因此使用此功能编写可读代码是惯用的。
换句话说,你问的问题应该更"which type represents best what the function does to anyone who reads its signature?"
对于Result<(), Workerror>
你可以直接看到from the docs
Result is a type that represents either success (Ok) or failure (Err)
所以,专门针对你的情况,这意味着你的函数 return 如果成功(由 Ok<()>
表示)或 WorkError
如果有错误(Err<WorkError>
).这是您在问题中描述函数的方式的非常直接的代码表示。
将此与 Option<WorkError>
或 Option<()>
Type Option represents an optional value: every Option is either Some and contains a value or None, and does not
在你的情况下 Option<WorkError>
将对 reader "this function should return a WorkError
but it may return nothing" 说。您可以记录 "return nothing" 情况意味着该函数实际上是成功的,但仅从类型来看并不是很明显。
Option<()>
表示 "this function can return nothing or have no meaningful return",如果 WorkError
不包含其他信息(如错误类型或错误消息)并且它实际上只是一个怎么说 "an error has occurred"。在这种情况下,一个简单的 bool
携带相同的信息......否则 Result
可以让你 return 一些与错误相关的更多信息。