Rust没有异常,而是把错误分为如下两种:
- 可恢复错误
Result<T,E>
-
panic!宏
Rust 有
panic!
宏。当执行这个宏时,程序会打印出一个错误信息,展开并清理栈数据,然后接着退出。
通过在toml中配置panic字段,可以修改宏的默认行为: 默认为展开调用栈数据,再退出
- 指定为abort时,调用宏会直接退出
当然程序中出错可能自动触发panic错误,而不需要手动使用panic!
宏。
result
result是一个枚举类型,包含成功和失败两个泛型的枚举。作为返回值时通过match
语句进行判断,并且可以根据T和E的具体类型进行更细化的处理:
- T 代表成功时返回的 Ok 成员中的数据的类型
- E 代表失败时返回的 Err 成员中的错误的类型
```rust
enum Result
{ Ok(T), Err(E), }
<a name="vDRVR"></a>
## match result
示例:打开文件成功和失败的处理:
```rust
use std::fs::File;
use std::io::ErrorKind;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
//根据不同error,进行更细化的处理,类似try catch的各种异常
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create("hello.txt") {
Ok(fc) => fc,
Err(e) => panic!("Problem creating the file: {:?}", e),
},
other_error => panic!("Problem opening the file: {:?}", other_error),
},
};
}
unwrap与expect
如果 Result 值是成员 Ok , unwrap 会返回 Ok 中的值。如果Result 是成员 Err , unwrap 会为我们调用默认**panic!**
。
let f = File::open("hello.txt").unwrap();
expect 与 unwrap 的使用方式一样:返回文件句柄或调用 panic! 宏。 expect 用来调用panic!的自定义错误信息将会作为参数传递给expect ,而不像 unwrap 那样使用默认的 panic!信息。
let f = File::open("hello.txt").expect("Failed to open hello.txt");
?运算符返回Result
如果 Result 的值是 Ok ,这个表达式将会返回 Ok 中的值而程序将继续执行。如果值是 Err , Err 中的值将作为整个函数的返回值,就好像使用了 return 关键字一样,这样错误值就被传播给了调用者。
useuseusestd::io;
std::io::Read;
std::fs::File;
fn read_username_from_file() -> Result<String, io::Error> {
let mut f = File::open("hello.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}