错误处理
掌握 Rust 的错误处理机制
可恢复错误与不可恢复错误
Rust 将错误分为两大类:可恢复错误(Result
使用 Result 处理可恢复错误
文件读取示例
fn read_username_from_file() -> Result {
let f = File::open("username.txt");
let mut f = match f {
Ok(file) => file,
Err(e) => return Err(e),
};
let mut s = String::new();
match f.read_to_string(&mut s) {
Ok(_) => Ok(s),
Err(e) => Err(e),
}
}
传播错误的简写:? 运算符
使用 ? 运算符可以简化错误传播的代码:
使用 ? 运算符
fn read_username_from_file() -> Result {
let mut f = File::open("username.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
错误处理流程图
graph TD
A[操作开始] --> B{可能失败?}
B -->|是| C[使用 Result]
B -->|否| D[返回正常值]
C --> E{错误类型?}
E -->|可恢复| F[返回 Result::Err]
E -->|不可恢复| G[使用 panic!]
F --> H[调用者处理错误]
H -->|处理成功| I[继续执行]
H -->|处理失败| J[向上传播]
G --> K[程序终止]
Result 处理流程
graph LR
A[Result] --> B{match}
B -->|Ok| C[处理成功值]
B -->|Err| D[处理错误]
A --> E[?运算符]
E -->|Ok| F[继续执行]
E -->|Err| G[自动返回错误]
panic! 与不可恢复错误
当遇到无法处理的情况时,使用 panic! 终止程序:
Panic 示例
fn main() {
let v = vec![1, 2, 3];
v[99]; // 这会导致 panic!
}
何时使用 panic!
- 程序处于无效状态
- 错误是不可恢复的
- 失败是意料之外的
练习
通过以下练习加深对错误处理的理解:
- 实现一个除法函数,返回 Result 类型处理除零错误
- 使用 ? 运算符重写文件读取函数
- 创建自定义错误类型并实现相关特征