禁用“注意:使用 `RUST_BACKTRACE=1` 环境变量运行以显示回溯”消息

问题描述 投票:0回答:2

如何在 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");
}

rust rust-cargo panic
2个回答
1
投票

只是不要将

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(())
}

0
投票

虽然我基本上同意评论/答案中的“不要”,但我确实认为在某些情况下定制恐慌的输出是有意义的!

例如,如果您正在制作面向用户的 CLI,您可能需要添加一些额外的信息,告诉用户在哪里报告崩溃。

当线程发生恐慌时,Rust 会调用一段称为“恐慌钩子”的代码,默认情况下,该代码会打印

run with RUST_BACKTRACE=1
文本(加上实际的回溯,如果您设置了该变量)。

您可以通过

std::panic::set_hook
:

使用您自己的函数/闭包覆盖此默认钩子
std::panic::set_hook(Box::new(|_| {
    println!("My cool panic output");
}));
© www.soinside.com 2019 - 2024. All rights reserved.