错误处理

Rust 用 Result<T, E> 表示可恢复错误,用 panic!(及 unwrap 等)表示不可恢复编程契约违背? 运算符在 ResultOption短路返回,依赖 泛型与TraitFrom 转换。


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 能转换到函数返回的错误类型)。
  • OptionNone提前返回 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(...)?)。

相关链接