当没有实际结果时,如何在 Rust 中强制执行错误处理?

lib*_*bra 3 error-handling rust

在 Rust 中,错误通过 Result<T,E> 嵌入到函数的返回类型中。这样,当我调用一个返回 T 类型的函数并且我实际上想使用该结果时,我必须以某种方式处理该错误。

现在,如果我调用一些通常不返回某些内容但可能以可恢复的方式失败的库函数,则假设它在复杂结构中设置了一些标志。现在,据我了解,编写此类函数的方法是使用 Result<(), Error> 作为返回类型。但现在调用此函数的代码必须显式处理错误,如果没有显式处理错误,则不会立即受到惩罚。如果我不期望得到结果,这是否会导致我作为一名程序员必须总是两次查看我正在使用的库中的每个函数签名?在有异常的语言中,我仍然需要使用一些 try-catch。

有人可以告诉我,我是否只是误解了这里的某些内容,是否有更好的方法来处理类似的情况,或者我是否是对的,程序员只需要小心这样的库函数?

Ale*_*uze 6

std::result::Result标有#[must_use]属性。这意味着如果忘记处理Result编译器将发出警告。例如下面的代码:

fn foo() -> Result<(), ()> {
    todo!()
}

fn bar() {
    foo();
}
Run Code Online (Sandbox Code Playgroud)

编译时出现警告:

warning: unused `Result` that must be used
 --> src/lib.rs:6:5
  |
6 |     foo();
  |     ^^^^^
  |
  = note: this `Result` may be an `Err` variant, which should be handled
  = note: `#[warn(unused_must_use)]` on by default
help: use `let _ = ...` to ignore the resulting value
  |
6 |     let _ = foo();
  |     +++++++
Run Code Online (Sandbox Code Playgroud)

所以你不必为了避免这种情况而格外小心。编译器会帮助你。

  • 您还可以使用板条箱根目录下的“#![forbid(unused_must_use)]”将其转换为编译错误。 (6认同)