Rust在Linux中的错误处理机制主要依赖Result类型、Option类型、?操作符及自定义错误类型,核心设计强调显式错误处理,避免隐式异常。以下是关键机制:
Result<T, E>
Ok(T)
表示成功并返回值,Err(E)
表示失败并携带错误信息。?
操作符简化错误传递,若结果为Err
则立即返回错误。Option
Some(T)
表示有值,None
表示无值。match
、unwrap_or
、map
等方法处理。?操作符
Err
则直接返回错误,否则解包继续执行。let content = read_file("file.txt")?;
,若文件打开失败会直接返回错误。自定义错误类型
std::error::Error
trait定义复杂错误类型,支持错误链和统一处理。thiserror
(简化自定义错误)、anyhow
(简化错误传播)。panic!宏
Result
处理错误。文件操作
use std::fs::File;
use std::io::Error;
fn read_file(path: &str) -> Result<String, Error> {
let mut file = File::open(path)?; // 错误传播
let mut contents = String::new();
file.read_to_string(&mut contents)?; // 错误传播
Ok(contents)
}
链式错误处理
fn parse_and_process(input: &str) -> Result<i32, String> {
input.parse::<i32>() // 解析可能失败
.and_then(|num| { // 链式处理
if num > 0 {
Ok(num * 2)
} else {
Err("数字必须为正".to_string())
}
})
}
自定义错误
#[derive(Debug)]
enum MyError {
IoError(std::io::Error),
ParseError(String),
}
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
MyError::IoError(e) => write!(f, "IO错误: {}", e),
MyError::ParseError(s) => write!(f, "解析错误: {}", s),
}
}
}
std::io::Error
处理Linux系统调用错误(如文件权限不足、路径不存在等)。unwrap
/expect
,强制显式处理错误。Box<dyn std::error::Error>
或anyhow
处理多种错误类型。log
库记录错误信息,便于调试。通过上述机制,Rust在Linux中实现了安全、可维护的错误处理,显著提升了代码的健壮性。