type
Post
date
Nov 4, 2025
slug
Rust/notebook/9
summary
学习下 Rust 圣经,记录笔记
status
Published
tags
Rust
category
技术茶点
icon
password
😀
Rust 将软件错误分为可恢复的(用 Result<T, E> 处理)和不可恢复的(用 panic! 宏停止执行),强制开发者在编译前处理所有可能的错误,从而提高程序的健壮性。

9.错误处理

9.1.用 panic! 处理不可恢复的错误

 
概念
含义
关键点
不可恢复错误 (unrecoverable error)
那些发生时程序无法恢复、必须终止运行的错误。 (doc.rust-lang.org)
例如访问数组越界。 (Massachusetts Institute of Technology)
panic!
用于显式触发程序终止错误。 (doc.rust-lang.org)
当检测到程序处于“逻辑不该到达的状态”时使用。
调用 panic! 或隐式 panic
- 显式:你在代码中写 panic!("message")。 (doc.rust-lang.org) - 隐式:标准库或运行时遇不可恢复情况,如越界访问,会自动 panic。 (Massachusetts Institute of Technology)
例如:v[99]v 长度为 3 时会 panic。 (doc.rust-lang.org)
栈展开 (unwinding) vs 立即中止 (abort)
当 panic 发生时,默认会“展开栈”(清理函数调用栈);也可配置为“立即中止”,不清理栈。 (Massachusetts Institute of Technology)
Cargo.toml[profile] 中设置 panic = "abort" 可改为中止模式。 (doc.rust-lang.org)
何时使用 panic! vs 返回 Result
当错误是程序逻辑错误、不能恢复、属于 bug 时用 panic!;当错误可预见、可恢复时用 Result<T, E>。 (rust-book.cs.brown.edu)
例如用户输入错误→返回 Result;索引越界(程序逻辑错误)→panic!
场景
示例代码
说明
手动触发 panic!
rust<br>fn main() {<br> panic!("程序出错:这是一个崩溃示例!");<br>}
panic! 宏立即打印错误信息并终止程序。
运行时触发 panic(数组越界)
rust<br>let v = vec![1, 2, 3];<br>v[99]; // 越界,panic
标准库检测到非法操作,会自动调用 panic。
panic 输出堆栈跟踪(backtrace)
bash<br>$ RUST_BACKTRACE=1 cargo run
设置环境变量 RUST_BACKTRACE=1 可查看函数调用栈,帮助定位错误。
栈展开与中止模式
toml<br>[profile.release]<br>panic = "abort"
在 release 构建中关闭栈展开,提高性能但无清理动作。
panic 示例:逻辑错误检查
rust<br>fn divide(a: i32, b: i32) -> i32 {<br> if b == 0 { panic!("不能除以零!"); }<br> a / b<br>}
panic! 检查“永远不应发生”的逻辑错误。

9.2.用 Result 处理可恢复的错误

 
概念
含义
关键点
Result<T, E> 枚举
用于表示可能成功 (Ok(T)) 或失败 (Err(E)) 的操作结果。 (doc.rust-lang.org)
T 是成功时返回的类型;E 是失败时返回的错误类型。 (doc.rust-lang.org)
使用 match 处理 Result
调用可能失败的函数后,用 match 分别处理 OkErr 情况。 (Massachusetts Institute of Technology)
示例:打开文件 File::open("hello.txt") 返回 Result<File, io::Error>。 (doc.rust-lang.org)
按错误种类不同处理
不只是 “失败就 panic”,而是根据错误种类(比如文件不存在)做不同处理。 (Massachusetts Institute of Technology)
例如:若文件不存在则创建,若权限不足则 panic。 (doc.rust-lang.org)
快捷处理:unwrap / expect
当你确信不会失败或愿意直接 panic 时,可用 unwrap() 或带消息的 expect()。 (Rustの日本語ドキュメント/Japanese Docs for Rust)
unwrap()Err 会 panic;expect("msg")Err 会用你提供的消息 panic。
错误传播(propagation)与 ? 运算符
当你编写返回 Result 的函数时,可以将内部错误 “向上传播”,用 ? 语法简化。 (doc.rust-lang.org)
? 只能在函数返回 Result 时使用;若遇 Err(e),自动 return Err(e)
何时用 Result 而非 panic!
若错误是可预见且可恢复的(例如文件没找到、用户输入错误)就用 Result;若是逻辑错误或程序无法继续,则用 panic!。 (rust-book.cs.brown.edu)
这样使程序更健壮、出错时也能优雅处理。

9.3.要不要 panic!

概念
含义
关键点
选择 panic! 还是 Result<T, E>
决定函数在错误时是直接终止(panic)还是返回可处理的错误(Result)。 (doc.rust-lang.org)
若代码 panic,则调用方 无法恢复;若返回 Result,调用方可以选择如何处理。 (doc.rust-lang.org)
适合用 panic! 的场景
样例代码、原型、测试中,以及程序逻辑中“绝对不该失败”的假设场景。 (Massachusetts Institute of Technology)
若某值是硬编码、确定无误,用 unwrapexpect 可以简化。 (rust-book.cs.brown.edu)
适合用 Result 的场景
错误是可预见的、可能发生且调用方应决定如何响应的情况。 (doc.rust-lang.org)
例如:解析用户输入、IO 操作失败、网络请求出错等“常见会失败”的情景。
一般指引
- 当你的函数假设调用方已提供合法数据、且后续逻辑依赖此假设,则 panic! 可能合理。 (doc.rust-lang.org) - 当失败是正常预期之一,而调用方可能想处理它,则应返回 Result。 (doc.rust-lang.org)
API 文档应明确说明何时会 panic/何时返回 Err。
 
《Rust 程序设计语言》(10/22)《Rust 程序设计语言》(8/22)
Loading...