Rust 抓取 panic 并恢复运行
2019-04-25 11:04 rust
长期运行的服务, 比如 web app 服务器, 需要抓取 panic, 防止因为处理一个请求出错 导致整个服务退出.
可以使用 panic 库来修改抓取异常退出. 示例如下:
use std::panic;
fn main() {
let result = panic::catch_unwind(|| {
println!("Hello");
});
assert!(result.is_ok());
let result = panic::catch_unwind(|| {
panic!("oh, no");
});
assert!(result.is_err());
println!("Hello, end of main()");
panic!("Panic self!");
}
同时, 也可以在 Cargo.toml
中修改 panic 的行为:
[profile.dev]
panic = "unwind"
[profile.release]
panic = "abort"
- 默认情况下, panic 时, 进程会打印一下出错的位置, 然后退出
- panic = "unwind", 允许抓取异常
- panic = "abort", 出错 panic 时, 直接 SigAbort 退出进程
Ref
- https://doc.rust-lang.org/edition-guide/rust-2018/error-handling-and-panics/aborting-on-panic.html