2 个不稳定版本
0.2.0 | 2018 年 12 月 24 日 |
---|---|
0.1.0 | 2018 年 12 月 24 日 |
#392 在 无标准库 中
302,201 每月下载量
在 14 个 Crates 中使用(直接使用 7 个)
6KB
ignore-result
适用于 rust
在结果不重要时安全地忽略函数返回值中的错误
此 crate 为 Result
实例添加了一个 .ignore()
函数,该函数忽略结果的 Ok
和 Err
变体,在不使用空 match
块的情况下抑制编译器关于未使用错误的警告,并且在调用 .unwrap()
时不会引发恐慌。
为什么你需要这个?
在某些涉及正确错误处理的情况下,即使调用失败,也希望调用方法并继续执行,这在与 C APIs 或嵌入式系统进行 FFI 接口时很常见。
作为一个具体的例子,假设你已经捕获了一个错误,需要将其冒泡到调用者那里,但在那之前,你需要尽力清理一些资源分配等。
如果你这样做
fn my_func() -> Result<(), E> {
let foo = something_important()?;
if foo.is_err() {
// Oh no! We can't continue, need to report this error,
// but first, try to clean up some state
cleanup()?;
}
return foo;
}
如果在 foo
中原始错误在执行 cleanup()
失败时丢失(因为 ?
会触发一个带有 cleanup()
返回值的早期中止,而不是 foo
中的原始错误 Err(e)
)。
如果您省略了 ?
,则编译器会警告您存在未检查/使用的结果,因为 cleanup()
可能会失败。
这是一个“尽力而为”的场景,您 希望 函数成功,如果它没有成功,您无能为力,而且有一个更高优先级的结果(错误)应该即使在此步骤失败时也保持不变。
因此,您可以这样做
let foo = something_import();
if foo.is_err() {
match cleanup() {
_ => {}
};
return foo;
}
或者使用这个crate并这样写
use ignore_result::Ignore;
if foo.is_err() {
cleanup.ignore();
return foo;
}
然后就可以继续前行了。
为什么这是安全的?
调用 foo().ignore()
返回 ()
,无论 foo()
是否评估为 Ok(_)
或 Err(_)
-- 这意味着它保证您不会(错误地)依赖一个 Ok(_)
)结果。
ignore
函数实际上消耗了 Result
(被声明为 fn ignore(self) -> ()
),保证在调用 foo().ignore()
之后,无法获取原始结果的 Ok
或 Err
变体,这反过来意味着调用者无法“假设它是 Ok
并使用返回值”(这是使用 monads 而不是 exceptions 的原始动机),并且它还使您的意图更清晰。