在 Python 中,可以这样来处理错误:

try:
    # code...
except:
    # do some thing...

但是在 Rust 中没有对应的语法来处理错误。在 Rust 中,错误被视为和正确同等重要的地位,他们都表示了程序运行的状态。为了描述错两种状态,需要用到枚举 Result<T, E>,处理错误,就等同于模式匹配 Result<T, E> 枚举。同样,在 Rust 中,没有空值,如果想要描述有无两种状态,需要用到枚举 Option<T>

在程序编写时,可用 .unwrap() 方法来快速获得值 T,同时,当取到 ErrNone 时,程序就会直接崩溃。然而,大多数情况下,得到 Err 或者 None 都不至于让程序崩溃。如果不想让程序崩溃,那每次都要进行模式匹配,人就要崩溃。还好,可用问号操作符 ? 在遇到 Err 或者 None 时,将其返回(传播)。但是问号操作符只能单独传播一种类型,当返回值是 Result<T, E> 时,只能传播 Err,同样返回值是 Option<T> 时,只能传播 None

使用 .ok_or_else 方法可以将 Option<T> 转换成 Result<T, E>,这就意味着,我们可以在取到 None 时,可以传播一个错误。下面,将举个例子加以说明,为了更简单的处理错误,本例使用了 anyhow 库(这个例子可能要以后再进行补充)。

[dependencies]
anyhow = "1.0"
use anyhow::{anyhow, Result};

let x = Some("foo");
assert_eq!(x.ok_or_else(|| anyhow!("failed to get value!")), Ok("foo"));
最后修改:2022 年 05 月 04 日
如果觉得我的文章对你有用,请随意赞赏