Rust 有两种错误,可预知的错误和不可预知的错误。一般对于可预知的错误,Rust 期望进行处理,对于不可预知的错误,一般会通过panic!宏中断程序执行。
Rust有两种错误处理方式,即 Reslt<T, E> 和 panic!。
9.1 使用 panic! 处理未知错误
在需要处理的地方直接使用panic!("error") 中断,程序会直接退出。
可以使用 RUST_BACKTRACE=1环境变量为输出 panic时的堆栈,来帮助分析定位问题。
9.2 使用 Result 处理已知错误
Result 与 Option类似,是一个枚举,一般用来表示结果。
enum Result<T, E> {
Ok(T);
Err(E);
}
一般使用Err来表示错误,标准库里都是这么用的。
到目前为止,一切正常,就是使用一个枚举来表示成功或失败。可以使用 match 进行匹配两种情况。
Result 有几个相关的函数可以使用:
unwraper,直接取出Ok的值,如果是Err,直接调用panic!except,类似unwraper,区别在于传入一个错误,用于panic!。
9.3 ? 操作符
? 操作符用于 Option, Result 类型或其他任意实现了FromResidual特性的类型,类似于c# 的?. ,区别在于
rust的?作用于表达式,可以与.分开使用rust的?当前面的值为None、Err时,直接返回该值并退出函数,而不是跳过.调用。
9.4 选择panic! 还是Result?
通常情况下,如果是以下情形会选择panic:
- 在示例代码、原型代码、测试代码中。此时通常需要直接中断来获取错误信息。
- 在开发人员更有把握的情况下,有时开发人员能够确定逻辑是正确的,不会发生错误,可以直接调用类似
except、unwraper等函数。 - 一些会破坏程序的操作。如果一些操作后,会导致系统处理错误的状态,可以选择中断。
可以通过封装类型来确保数据处于安全的状态。
pub struct Guess {
value: i32,
}
imp Guess{
pub fn new(value: i32) -> Guess{
if value < 1 || value > 100 {
panic!("Guess value must be between 1 and 100, got {}.", value);
}
Guess{value}
}
pub fn value(&self) -> i32 {
self.value
}
}
要求开发人员必须明确接受的值在0~100之间。