跳至主要內容

错误处理

ColorSky大约 1 分钟笔记Rust

错误的分类

  • 可恢复
    • 列如文件未找到,可再次尝试
    • 应对机制:Result<T, E>
  • 不可恢复
    • Bug,列如访问的索引超出范围
    • 应对机制:panic! 程序立即终止执行

panic! - 不可恢复的错误

  • 当 panic!执行时
    • 程序答应错误信息
    • 展开,清理调用栈
      1. Rust 会展开调用栈(工作量大)
        • Rust 沿着调用栈往回走
        • 清理每个遇到的的函数的数据
      2. 立即终止调用栈
        • 不进行清理,直接停止程序
        • 内存需要操作系统清理
      • 想让二进制文件更小可以把展开设置为终止
        在 Cargo.toml 中设置
        [profile.release]
        panic = 'abort'
        
    • 退出程序

Result 枚举

enum Result<T, E> {
    OK(T),
    ERR(E),
}
  • example

    use std::fs::File;
    
    fn main() {
        let f = File::open("hello.world");
    
        let f = match f {
            Ok(file) => file,
            Err(error) => panic!("open file error {:#?}", error),
        };
        println!("{:#?}", f)
    }
    

    在该例中,File::open("hello.world")的返回值有Ok(T)Err(E),其中 T 是我们需要的文件对象

何时使用 panic!

  • 演示 unwrap
  • 原型代码 unwrap, expect
  • 测试 ubwrap, expect
  • 有时你确定 Result 的返回就是 Ok: 使用 unwrap
    use std::net::IpAddr;
    fn main() {
    //你可以确定该字符可以被成功转化为ip地址,但是parse()会返回Result类型,所以编译器任然认为可能出现panic!
    let ip: IpAddr = "127.0.0.1".parse().unwrap();
    }