C9 错误处理
Rust 有两类错误, 包括可恢复, 不可恢复两种. 分别可用 panic!
和 Result<T, E>
表示.
https://doc.rust-lang.org/book/ch09-00-error-handling.html
在 Rust 中没有 exception 的概念, 而是通过上述两种类型结合实现 exception.
不可恢复错误 panic
在 Rust 中, 有两种 panic 的可能性:
- 在代码中触发 panic(比如数组下标访问越界)
- 主动使用
panic!
宏
默认情况下, panic 时, 会打印失败信息, 进行 unwind, 清理 stack, 然后退出.
打印失败信息时, 可以将整个调用栈情况打印出来, 只需要在运行时设置环境变量 RUST_BACKTRACE=1 cargo run
即可. 当非 --release
build 或 run 时, 即可自动生成 debug 符号, 这样调用栈信息可以原样打印出来.
关于何时使用 panic 的讨论, 详见后面内容.
关于 unwind 和 abort
当 panic 发生时, 程序会开始 unwinding, 即 Rust 会顺着栈往回走, 将每个栈帧的数据进行清理. 但这样也意味着可能会有大量的操作在 unwind 时进行.
因此 rust 中可以自定义 panic 后的行为: unwind 或 abort.
abort 即直接退出而不进行清理, 意味着程序使用的内存将由操作系统进行清理. 当希望程序包体积能尽可能小的时候, 就可以将 panic 后行为设置为 abort.
设置 abort 的方法也非常简单, 只需要在 [profile]
部分写一行 panic = 'abort'
即可.