目录
什么是 Rust 错误处理
Rust 错误处理是指在程序中检测、报告和处理异常情况的机制。Rust 通过显式的方式(如 Result
和 Option
)管理错误,避免了传统语言中未处理的异常,确保程序健壮性。
为什么要进行错误处理
- 可靠性:防止程序因未处理错误而崩溃。
- 清晰性:明确错误来源和处理逻辑。
- 类型安全:编译器强制处理可能的失败情况。
- 用户体验:提供有意义的错误信息。
错误类型与分类
- 可恢复错误:
- 使用
Result<T, E>
表示,可能成功(Ok(T)
)或失败(Err(E)
)。 - 不可恢复错误:
- 使用
panic!
宏,直接终止程序,适用于致命错误。 - 空值情况:
- 使用
Option<T>
表示,可能有值(Some(T)
)或无值(None
)。
错误处理机制
panic!
:
- 引发不可恢复的错误,程序退出。
Result
:
match
或if let
匹配处理。?
运算符:简化错误传播。
Option
:
- 类似
Result
,处理可能缺失的值。
- 组合工具:
unwrap()
:直接取值,失败时 panic。expect()
:类似unwrap
,但可自定义消息。
自定义错误
- 定义错误类型:使用
enum
或struct
。 - 实现
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),
}
}
运行结果:
错误: 无效输入: 路径为空
参考资料与出站链接
- 官方文档:
- 学习资源:
- 社区支持:
发表回复