let x: Option<i32> = None;
let guaranteed_value = x.or(Some(3)); //it's Some(3)
或者如果您想将Option转换为Result。
let x = Some("foo");
assert_eq!(x.ok_or("No value found"), Ok("foo"));
let x: Option<&str> = None;
assert_eq!(x.ok_or("No value found"), Err("No value found"));
2条答案
按热度按时间oiopk7p51#
Rust通常以两种方式解决错误:
*不可恢复的错误。一旦你
panic!
,就是这样。你的程序或线程中止,因为它遇到了一些它无法解决的问题,并且它的不变量被违反。例如,如果你在应该是UTF-8字符串的字符串中找到无效的序列。*可恢复错误。在某些文档中也称为失败。您不会惊慌失措,而是发出
Option<T>
或Result<T, E>
。在这些情况下,您可以选择分别为有效值Some(T)
/Ok(T)
或无效值None
/Error(E)
。通常None
用作null
的替换,表明该值丢失。接下来是最难的部分。申请。
解包
有时候处理
Option
是件很麻烦的事,你几乎可以保证得到一个值而不是一个错误。在这些情况下,使用
unwrap
是完全可以的。unwrap
将Some(e)
和Ok(e)
转换为e
,否则它会死机。Unwrap是一个将可恢复的错误转换为不可恢复的工具。在
if
-块内部,可以很好地解包,因为它永远不会死机,因为我们已经检查过它是Some
和x.is_some()
。如果你正在编写一个库,不建议使用
unwrap
,因为当它死机时,用户无法处理错误。此外,未来的更新可能会更改不变量。想象一下,如果上面的例子有if x.is_some() || always_return_true()
。不变量会更改,unwrap
可能会死机。在这个例子中,你应该使用
ìf let
:?
运算符/try!
宏什么是
?
操作符或try!
宏?简单的解释是,它要么返回Ok()
内部的值,要么过早地返回错误。下面是操作符或宏扩展到的对象的简化定义:
如果你这样使用它:
它将把它转换成这样:
缺点是函数现在返回
Result
。组合器
Option
和Result
有一些方便的方法,允许链接和以可理解的方式处理错误。方法如and
,and_then
,or
,or_else
,ok_or
,map_err
等。例如,您可以有一个默认值,以防您的值出错。
或者如果您想将
Option
转换为Result
。这只是你可以做的事情的一个简短的浏览。更多的解释,请查看:
gfttwv5a2#
如果你需要终止一些独立的执行单元(一个web请求,一个视频帧处理,一个GUI事件,一个要编译的源文件),但不是所有的应用程序,有一个函数std::panic::catch_unwind,它调用一个闭包,如果发生一个解卷恐慌,它会捕获解卷恐慌的原因。
我不会授予这个闭包对任何可能超过它的变量或任何其他全局状态的写访问权限。
文档还说,该函数也可能无法捕获某些类型的恐慌。