panic! 与不可恢复错误
学习目标
- 理解 panic 的使用场景
- 掌握
unwrap和expect - 理解 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...