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——生产代码中应避免