错误处理
Rust 用 Result<T, E> 表示可恢复错误,用 panic!(及 unwrap 等)表示不可恢复或编程契约违背。? 运算符在 Result 与 Option 上短路返回,依赖 泛型与Trait 的 From 转换。
Result<T, E>
enum Result<T, E> {
Ok(T),
Err(E),
}Ok:成功载荷T(常为返回值)。Err:错误E(常为实现std::error::Error的类型)。
? 运算符
fn read() -> Result<String, io::Error> {
let mut s = String::new();
std::io::stdin().read_to_string(&mut s)?;
Ok(s)
}?:若为Err(e),则从当前函数返回Err(From::from(e))(需E能转换到函数返回的错误类型)。- 对
Option:None时提前返回None(函数返回类型须为Option)。
panic!
栈展开(unwind)或中止(abort)由编译选项决定;用于不应发生的逻辑错误。库代码宜返回 Result,把是否 panic 交给调用方。
unwrap / expect
- 生产路径慎用:失败即 panic。
- 原型、测试、确信不会失败时可简化代码。
Option<T> 与错误
**「没有值」用 Option;「操作失败」**用 Result。二者可用 ok_or / transpose 等互转。
match / if let 见 模式匹配。
生态:thiserror / anyhow
thiserror:为库定义细粒度错误类型并derive(Error)。anyhow:应用层统一anyhow::Result,附加上下文(.context(...)?)。