error-handling - 如果成功,从没有结果的函数返回错误的惯用方法是什么?

标签 error-handling rust option-type idioms rust-result

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

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

当然,也有一些函数具有单一、明显的失败状态,因此改用 Option 类型。一个惯用的例子是这样的:

fn do_work() -> Option<u64>

这一切都在文档中直接解决。但是,我对函数可能失败但在成功时没有有意义的值(value)的情况感到困惑。比较以下两个函数:

fn do_work() -> Option<WorkError>
// vs
fn do_work() -> Result<(), WorkError>

我只是不确定其中哪一个更惯用,或者在现实世界的 Rust 代码中使用得更频繁。对于此类问题,我的首选资源是 Rust 书,但我认为它的“Error Handling”部分没有解决这个问题。我对任何其他 Rust 文档也不太满意。

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

最佳答案

使用 fn do_work() -> Result<(), WorkError> .

Result<(), WorkError>意味着您希望完成工作,但可能会失败。

Option<WorkError>意味着你想得到一个错误,但它可能不存在。

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

我希望 Option<WorkError>仅在 fn get_last_work_error() -> Option<WorkError> 等情况下使用.

关于error-handling - 如果成功,从没有结果的函数返回错误的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36878044/

相关文章:

rust - 模式匹配 float 的替代方案是什么?

Swift:向下转换为已知类型

python - 如何处理 `MissingRequiredArgument`错误

scala - 使用尝试异常上下文

php - header ('Location:')无法正常工作

php - 在 PHP 中获取异常上下文

rust - Rust-使用serde/reqwest “Invalid type”反序列化

rust - 摆弄生命周期 : sanity check on unsafe reinterpretation of lifetimes

java 8 不止一次检查可选的空值

ios - Swift 枚举被视为可选?