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之间。
- 打赏
- 分享
分享到...
请选择打赏方式
- 微信
- 支付宝