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) | |
栈展开 (unwinding) vs 立即中止 (abort) | 当 panic 发生时,默认会“展开栈”(清理函数调用栈);也可配置为“立即中止”,不清理栈。 (Massachusetts Institute of Technology) | |
何时使用 panic! vs 返回 Result | 例如用户输入错误→返回 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> 枚举 | ||
使用 match 处理 Result | ||
按错误种类不同处理 | 不只是 “失败就 panic”,而是根据错误种类(比如文件不存在)做不同处理。 (Massachusetts Institute of Technology) | 例如:若文件不存在则创建,若权限不足则 panic。 (doc.rust-lang.org) |
快捷处理:unwrap / expect | unwrap() 遇 Err 会 panic;expect("msg") 遇 Err 会用你提供的消息 panic。 | |
错误传播(propagation)与 ? 运算符 | ? 只能在函数返回 Result 时使用;若遇 Err(e),自动 return Err(e)。 | |
何时用 Result 而非 panic! | 这样使程序更健壮、出错时也能优雅处理。 |
9.3.要不要 panic!
概念 | 含义 | 关键点 |
选择 panic! 还是 Result<T, E> | 决定函数在错误时是直接终止(panic)还是返回可处理的错误(Result)。 (doc.rust-lang.org) | 若代码 panic,则调用方 无法恢复;若返回 Result,调用方可以选择如何处理。 (doc.rust-lang.org) |
适合用 panic! 的场景 | 样例代码、原型、测试中,以及程序逻辑中“绝对不该失败”的假设场景。 (Massachusetts Institute of Technology) | |
适合用 Result 的场景 | 错误是可预见的、可能发生且调用方应决定如何响应的情况。 (doc.rust-lang.org) | 例如:解析用户输入、IO 操作失败、网络请求出错等“常见会失败”的情景。 |
一般指引 | - 当你的函数假设调用方已提供合法数据、且后续逻辑依赖此假设,则 panic! 可能合理。 (doc.rust-lang.org) - 当失败是正常预期之一,而调用方可能想处理它,则应返回 Result。 (doc.rust-lang.org) | API 文档应明确说明何时会 panic/何时返回 Err。 |
- Author:沈林曦
- URL:https://blog.aibhtt.com/article/Rust/notebook/9
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts












