SyMind / learning

路漫漫其修远兮,吾将上下而求索。
9 stars 1 forks source link

Rust 错误处理 #67

Open SyMind opened 1 year ago

SyMind commented 1 year ago

在 Rust 中,错误分为两大类:可恢复错误与不可恢复错误。

Rust 提供了用于可恢复错误的类型 Result<T, E>,以及在程序出现不可恢复错误时中止运行的 panic! 宏。

不可恢复错误与 panic!

程序会在panic! 宏执行时打印出一段错误提示信息,展开并清理当前的调用栈,然后退出程序。这种情况大部分都发生在某个错误被检测到,但程序员却不知该如何处理的时候。

可恢复错误与 Result

enum Result<T, E> {
    Ok(T),
    Err(E),
}

失败时触发 panic 的快捷方式:unwrap 和 expect

类型 Result<T, E> 本身定义了 unwrap 方法。当 Result 的返回值是 Ok 变体时,unwrap 就会返回 Ok 内部的值。而当 Result 的返回值是 Err 变体时,unwrap 则会替我们调用 panic! 宏。

还有 expect 方法,它允许我们在 unwrap 的基础上指定 panic! 所附带的错误提示信息。

传播错误

传播错误的模式在 Rust 编程中非常常见,所以 Rust 专门提供了一个问号运算符(?)来简化它的语法。

被 ? 运算符所接收的错误值会隐式地被 from 函数处理,这个函数定义于标准库的 From trait 中,用于在错误类型之间进行转换。当 ? 运算符调用 from 函数时,它就开始尝试将传入的错误类型转换为当前函数的返回错误类型。当一个函数拥有不同的失败原因,却使用了统一的错误返回类型来同时进行表达时,这个功能会十分有用。只要每个错误类型都实现了转换为返回错误类型的 from 函数,? 运算符就会自动帮我们处理所有的转换过程。

使用了 ? 运算符的函数必须返回 Result、Option 或任何实现了 std::ops::Try 的类型。