1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//1.rust将错误类型分为两个类别:可恢复错误和不可恢复错误
//(1) 可恢复错误通常代表向用户报告错误和重试操作是合理的情况,如未找到文件。
//rust使用Result<T,E>来实现
//(2) 不可恢复错误是bug的同义词,如尝试访问超过数组结尾的位置。rust中通过panic!
//来实现

//2. panic!

//3.使用BACKTRACE = 1

//4.Result<T,E>

//5.简写

//6. 当编写一个函数,但是函数可能会失败,此时除了在函数中处理错误之外,还可以
//将错误传递给调用者,让调用者处理,称为传播错误

//7.传播错误的简写方式

//8. 更进一步简写

//9.什么时候用panic,什么时候用Result
//(1)示例,代码原型、测试使用panic!\unwrap\expect
//(2)实际项目中使用Result

//10.Option和Result
//为空使用Option,为错误使用Result

// 2.
fn main()
{
panic!("crash here");
}
  • 3rust中backtrace = 1
1
RUST_BACKTRACE=1 cargo run # 显示运行过程中的细节
  • 4.Result<T,E>
1
2
3
4
enum Result<T,E> {
Ok(T),
Err(E),
}
  • 5.简写
1
2
3
4
5
6
7
8
9
use std::fs::File;
fn main() {
let f = File::open("Hello.txt");
let r = match f {
Ok(file) => file,
Err(error) => panic!("error: {:?}",error),
};

}
  • 实际上可以:(编译器提示)
1
2
3
4
5
6
use std::fs::File;
fn main() {
let f = File::open("Hello.txt").unwrap();

}

  • 或者(自行提示)
1
2
3
4
5
use std::fs::File;
fn main() {
let f = File::open("Hello.txt").expect("Failed to open hello.txt");

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use std::io;
use std::io::Read;
use std::fs::File;

fn main() {
let r = read_username_from_file();
match r {
Ok(s) => println!("s = {}",s),
Err(e) => println!("err = {:?}",e),
}
}

fn read_username_from_file() -> Result<String,io: Error> {
let f = File::open("hello.txt");
let mut f = match f {
Ok(file) => file,
Err(error) => return Err(error),
};

let mut s = String::new();
match f.read_to_string(&mut s) {
Ok(_) => Ok(s),
Err(error) => Err(error),
}

}
  • 7.这一部分实际上可以简写,使用?抛出error
1
2
3
4
5
6
7
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)
}
  • 8.进一步简化,使用连写的方式
1
2
3
4
5
6
fn read_username_from_file() -> Result<String,io: Error> {
let mut s = String::new();
File::open("hello.txt")?.read_to_string(&mut s)?;
Ok(s)
}