目录

  1. 什么是 Rust 错误处理
  2. 为什么要进行错误处理
  3. 错误类型与分类
  4. 错误处理机制
  5. 自定义错误
  6. 代码示例
  7. 参考资料与出站链接

什么是 Rust 错误处理

Rust 错误处理是指在程序中检测、报告和处理异常情况的机制。Rust 通过显式的方式(如 ResultOption)管理错误,避免了传统语言中未处理的异常,确保程序健壮性。


为什么要进行错误处理

  • 可靠性:防止程序因未处理错误而崩溃。
  • 清晰性:明确错误来源和处理逻辑。
  • 类型安全:编译器强制处理可能的失败情况。
  • 用户体验:提供有意义的错误信息。

错误类型与分类

  • 可恢复错误
  • 使用 Result<T, E> 表示,可能成功(Ok(T))或失败(Err(E))。
  • 不可恢复错误
  • 使用 panic! 宏,直接终止程序,适用于致命错误。
  • 空值情况
  • 使用 Option<T> 表示,可能有值(Some(T))或无值(None)。

错误处理机制

  1. panic!
  • 引发不可恢复的错误,程序退出。
  1. Result
  • matchif let 匹配处理。
  • ? 运算符:简化错误传播。
  1. Option
  • 类似 Result,处理可能缺失的值。
  1. 组合工具
  • unwrap():直接取值,失败时 panic。
  • expect():类似 unwrap,但可自定义消息。

自定义错误

  • 定义错误类型:使用 enumstruct
  • 实现 std::error::Error trait。
  • 使用 thiserror 库简化(需添加依赖)。
[dependencies]
thiserror = "1.0"

代码示例

panic! 示例

fn main() {
    let v = vec![1, 2, 3];
    // v[10];  // 越界,自动 panic
    panic!("手动引发错误");
}

运行结果:

thread 'main' panicked at '手动引发错误', src/main.rs:4:5

Result 处理

use std::fs::File;

fn main() -> Result<(), std::io::Error> {
    let f = File::open("hello.txt")?;
    // 如果文件不存在,? 返回 Err
    Ok(())
}

Option 与 match

fn find_first_even(numbers: &[i32]) -> Option<i32> {
    for &num in numbers {
        if num % 2 == 0 {
            return Some(num);
        }
    }
    None
}

fn main() {
    let nums = vec![1, 3, 4, 7];
    match find_first_even(&nums) {
        Some(n) => println!("First even: {}", n),
        None => println!("No even number found"),
    }
}

运行结果:

First even: 4

自定义错误

use std::fmt;
use thiserror::Error;

#[derive(Error, Debug)]
enum MyError {
    #[error("无效输入: {0}")]
    InvalidInput(String),
    #[error("IO 错误")]
    Io(#[from] std::io::Error),
}

fn process_file(path: &str) -> Result<(), MyError> {
    if path.is_empty() {
        return Err(MyError::InvalidInput("路径为空".to_string()));
    }
    let _f = File::open(path)?;
    Ok(())
}

fn main() {
    match process_file("") {
        Ok(()) => println!("成功"),
        Err(e) => println!("错误: {}", e),
    }
}

运行结果:

错误: 无效输入: 路径为空

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 社区支持