分类

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