错误处理

掌握 Rust 的错误处理机制

可恢复错误与不可恢复错误

Rust 将错误分为两大类:可恢复错误(Result)和不可恢复错误(panic!)。

使用 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!

练习

通过以下练习加深对错误处理的理解:

  1. 实现一个除法函数,返回 Result 类型处理除零错误
  2. 使用 ? 运算符重写文件读取函数
  3. 创建自定义错误类型并实现相关特征
返回首页