37·错误处理入门

panic! 与不可恢复错误

panic! 与不可恢复错误

学习目标

  1. 理解 panic 的使用场景
  2. 掌握 unwrapexpect
  3. 理解 RUST_BACKTRACE

核心概念

panic! 宏

fn main() {
    // panic!("程序崩溃了");

    // 数组越界会 panic
    let v = vec![1, 2, 3];
    // v[10];  // panic: index out of bounds
}

unwrap 和 expect

fn main() {
    // unwrap: Ok/Some 则取出,Err/None 则 panic
    let x: Result<i32, &str> = Ok(42);
    let val = x.unwrap();  // 42

    // expect: 同上,但自定义 panic 消息
    let val = x.expect("should be ok");

    // 实际使用
    let home = std::env::var("HOME")
        .expect("HOME environment variable not set");

    // 推荐:生产代码用 match 或 ?
    // unwrap/expect 适合:原型、测试、确定不会失败时
}

RUST_BACKTRACE

RUST_BACKTRACE=1 cargo run    # 显示完整调用栈
RUST_BACKTRACE=full cargo run # 更详细

abort vs unwind

# Cargo.toml
[profile.release]
panic = "abort"  # 直接终止,不展开栈

小结

场景推荐方式
原型开发unwrap()
测试代码unwrap(), expect()
确定不会失败unwrap()
可能失败match, if let, ?
不可恢复panic!()

练习编辑器

rust
Loading...