如何在 Rust 出现恐慌时禁用“注意:使用
RUST_BACKTRACE=1
环境变量运行以显示回溯”?我的代码:
use std::{env, fs, path::Path};
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 3{
panic!("Incorrect args!");
}
let query: &String = &args[1];
let path: &Path = Path::new(&args[2]);
println!("Search: \"{query}\"\nPath: \"{}\"", path.to_str().unwrap());
match path.exists(){
true => (),
false => {panic!("Invalid file path!");}
}
println!("Success");
}
只是不要将
panic!
用于其设计目的以外的情况,它适用于除非程序中有错误否则不会发生的状态,如果您想发出预期的错误条件信号,可以使用 Result
在main
就像你无论如何都应该这样做:
use std::{env, fs, path::Path};
fn main() -> Result<(), &'static str> {
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
return Err("Incorrect args!");
}
let query: &String = &args[1];
let path: &Path = Path::new(&args[2]);
println!("Search: \"{query}\"\nPath: \"{}\"", path.display());
if !path.exists() {
return Err("Invalid file path!");
}
println!("Success");
Ok(())
}
虽然我基本上同意评论/答案中的“不要”,但我确实认为在某些情况下定制恐慌的输出是有意义的!
例如,如果您正在制作面向用户的 CLI,您可能需要添加一些额外的信息,告诉用户在哪里报告崩溃。
当线程发生恐慌时,Rust 会调用一段称为“恐慌钩子”的代码,默认情况下,该代码会打印
run with RUST_BACKTRACE=1
文本(加上实际的回溯,如果您设置了该变量)。
std::panic::set_hook
: 使用您自己的函数/闭包覆盖此默认钩子
std::panic::set_hook(Box::new(|_| {
println!("My cool panic output");
}));