错误处理
Rust 把错误分为两类:不可恢复的 panic,以及可恢复的 Result<T, E>。选择哪种,取决于程序是否还有继续运行的意义。
panic! 与 Result
panic! 用于不可恢复错误,会展开栈并退出。常见触发包括数组越界、解 unwrap() 失败。Result<T, E> 是枚举,Ok(T) 表示成功,Err(E) 表示失败,适合处理可预期的错误。
fn read_num(s: &str) -> Result<i32, std::num::ParseIntError> {
s.parse::<i32>()
}
? 运算符
? 在返回 Result 的函数里展开:成功时取 Ok 内的值,失败时把 Err 提前返回给调用方,使代码线性可读。
fn first() -> Result<i32, std::num::ParseIntError> {
let n = "42".parse::<i32>()?;
Ok(n + 1)
}
Option<T> 的链式调用
Option<T> 表示可有可无的值。map 用于转换内部值,and_then 用于链式返回 Option 的操作,二者经常配合 ? 一起使用。
let s = "3";
let n: Option<i32> = s.parse().ok().map(|v| v * 2);
From 自定义错误类型
为业务错误实现 From<SourceError>,? 就会自动调用 From::from 做转换,无需在调用点反复包装。
struct AppError;
impl From<std::io::Error> for AppError { /* ... */ }
把 AppError 作为统一返回类型,库边界与业务层之间的错误传递会非常干净。