title: Rust从panic中恢复 toc: true cover: 'https://img.paulzzh.com/touhou/random?22' date: 2022-11-17 13:49:07 categories: Rust tags: [Rust]
在Go中我们知道,如果程序在运行时发生了panic,如果不使用 recover 恢复,则程序会直接退出;
同样的,在Rust中发生数组越界、unwrap 错误等都会panic;
通常情况下,发生panic之后,rust会中断程序执行并退出;
但是我们也可以指定panic为unwind来展开调用栈,而非中断执行并退出程序;
源代码:
参考:
<br/>
<!--more-->Rust 中可以通过在 Cargo.toml
中的 profile
中增加 panic 相应的配置来修改 panic 的行为;
例如:
下面是配置:
[profile.dev]
panic = "unwind"
[profile.release]
panic = "abort"
测试的代码如下:
extern crate core;
use std::panic;
fn main() {
let res = panic::catch_unwind(|| {
println!("not panic");
});
assert!(res.is_ok());
let res = panic::catch_unwind(|| {
panic!("panicked!");
});
assert!(res.is_err());
println!("End of main()");
}
此时,在 dev 模式下:
$ cargo run
not panic
thread 'main' panicked at 'panicked!', src\main.rs:12:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
End of main()
程序打印:End of main()
,并正常退出;
如果在 release 模式下:
$ cargo run --release
not panic
thread 'main' panicked at 'panicked!', src\main.rs:12:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `target\release\rust-learn.exe` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)
则会直接退出执行,不会打印最后的输出!
<br/>
源代码:
参考:
<br/>