Z
ZHANK
编程在线教程Rust 教程panic! 与不可恢复错误
模式匹配与错误

panic! 与不可恢复错误

panic!/unwrap/expect 使用场景、catch_unwind、设置 panic=abort

panic! 与不可恢复错误

panic! 是 Rust 的"不可恢复错误"——程序在此中止。unwrap/expect 是 panic 的快捷方式。

学完本章你将: 掌握 panic!/unwrap/expect 使用场景、catch_unwind。


panic! 宏

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

    let v = vec![1, 2, 3];
    // v[99];  // panic: index out of bounds
}

unwrap vs expect

rust
let x: Option<i32> = None;

// unwrap —— panic 时无额外信息
// x.unwrap();  // panic: called `Option::unwrap()` on a `None` value

// expect —— panic 时带自定义信息(推荐)
// x.expect("x 应该有值——这不应该发生");

// 生产代码中避免 unwrap/expect——用 match 或 ?

catch_unwind —— 捕获 panic

rust
use std::panic;

let result = panic::catch_unwind(|| {
    panic!("出错了!");
});

match result {
    Ok(_) => println!("没有 panic"),
    Err(e) => println!("捕获到 panic: {:?}", e),
}

// ⚠️ catch_unwind 不保证捕获所有 panic
// 设置 panic = 'abort' 后无法捕获

何时用 panic vs Result

rust
// ✅ 用 Result——可预期的失败(文件不存在、网络超时)
// ✅ 用 panic——不可恢复的错误(数组越界、违反不变量)

// ✅ unwrap/expect——原型阶段、测试中
// ❌ unwrap——生产代码中应避免