用途:诊断与预防 Rust 程序的运行时 panic,包括索引越界、.unwrap() 遇 None/Err、整数溢出、除零等,并帮助选择 panic 策略(unwind 与 abort)、读取 backtrace、在 FFI 边界用 catch_unwind 兜底。核心观点:panic 只用于不可恢复的程序缺陷,预期内的失败应返回 Result;多数运行时 panic 是调用点本可用 Result 或受检方法避免的编程错误。
主要能力与要点:常见 panic 消息与根因/修复对照(index out of bounds 用 .get 或校验;Option/Result unwrap 改用 match、if let、? 或 unwrap_or;溢出用 checked_add/saturating_add/wrapping_add;除零用 checked_div 或守卫除数;unreachable!/todo!/unimplemented! 属逻辑或未实现分支)。
必要用法:复现 panic 前设 RUST_BACKTRACE=1(或 full)运行,backtrace 中最内层属于自己的 crate 帧即 panic 点。生产代码中的 .unwrap()/.expect() 应视为缺陷,除非能证明 None/Err 不可能;只在确实要 panic 时用 .expect("不变式说明")。来自用户输入、文件、网络等外部来源的索引一律用 .get(i) 返回 Option。溢出可能发生时使用受检算术方法。FFI 边界在 panic=unwind 下用 std::panic::catch_unwind 包裹,避免 panic 展开进 C(除非函数为 extern "C-unwind")。
策略与限制:panic=unwind 默认逐帧展开、运行 Drop、可被 catch_unwind 捕获;panic=abort 进程直接终止,不可捕获。可在 Cargo.toml 按 profile 设置,如 [profile.release] panic = "abort"。测试、基准、构建脚本和过程宏始终使用 unwind。发布构建默认整数溢出会静默回绕,只有 dev profile 会 panic,可设 overflow-checks = true。除零在所有构建都 panic,浮点除零不 panic(得到 inf/NaN)。Drop 中不得 panic,否则展开时二次 panic 会立即中止进程。catch_unwind 不是通用错误处理,仅供 FFI 边界与线程隔离。process::exit 不会运行栈上局部变量的 Drop,process::abort 立即以 SIGABRT 终止。
参考文件包括 references/methods.md、references/examples.md、references/anti-patterns.md。具体命令与代码示例以原文为准。