什么是在tokio任务中传播恐慌的推荐方式?

12

现在我的panic被忽略了。在我的使用场景中,我希望它能崩溃整个程序,并打印堆栈跟踪信息。应该如何配置?

1个回答

18

通常情况下,panic不会被吞掉,而是在等待从tokio::task::spawn()tokio::task::spawn_blocking()返回的tokio::task::JoinHandle时作为错误返回,并且可以相应地处理。

如果在Tokio运行时内发生panic,则会像这样向stderr打印错误消息:"thread 'tokio-runtime-worker' panicked at 'Panicking...', src\main.rs:26:17"。如果您使用环境变量RUST_BACKTRACE设置为1来运行二进制文件,则还会打印堆栈跟踪。

与所有Rust程序一样,您可以使用std::panic::set_hook()设置自己的panic处理程序,在打印panic信息后使其退出,例如:

let default_panic = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
    default_panic(info);
    std::process::exit(1);
}));

这样突然退出并不理想,在现实世界的情况下,你首先需要确保在退出之前关闭或释放任何已保留的资源、连接等。 - vasilakisfil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接