Rust 有没有办法使expect()输出的消息更方便用户?

Rust 有没有办法使expect()输出的消息更方便用户?,rust,Rust,我发现由生成的消息对用户非常不友好。考虑下面的简短例子… use std::env; fn main() { let imagefn = env::args().skip(1).next().expect("Filename not provided."); println!("{}", imagefn); } 这些错误包括: 线程“main”在“未提供文件名”处惊慌失措,libcore/option.rs:960:5 注意:使用'RUST_BACKTRACE=1'运行回溯跟

我发现由生成的消息对用户非常不友好。考虑下面的简短例子…

use std::env;

fn main() {
    let imagefn = env::args().skip(1).next().expect("Filename not provided.");
    println!("{}", imagefn);
}
这些错误包括:

线程“main”在“未提供文件名”处惊慌失措,libcore/option.rs:960:5
注意:使用'RUST_BACKTRACE=1'运行回溯跟踪。
我发现
expect()
对于编写快速代码非常有用,但希望我能输出更多类似的内容:

未提供文件名。
隐藏所有其他信息,除非我实际提供环境变量,作为开发人员,我应该知道。我想我的问题是:

  • 有没有一种方法可以覆盖
    expect()
    来执行此操作
  • 为什么
    expect()
    即使在发布版本中也会输出其不友好的消息
  • 这只是对
    panic的一个方便的条件调用!()

    理想情况下,您应该在返回
    选项或
    结果的函数中使用
    运算符来处理此问题,以便能够以更优雅的方式处理此类问题

    如果您只想返回外观更友好的消息并退出,您可以实现自己的功能,打印消息并以终止。

    您可以使用更改紧急消息。例如:

    use std::panic::set_hook;
    
    fn main() {
        set_hook(Box::new(|info| {
            if let Some(s) = info.payload().downcast_ref::<String>() {
                println!("{}", s);
            }
        }));
    
        // Displays: "My error message":
        Option::None::<i32>.expect("My error message");
    }
    

    请注意,您可以创建自己的扩展方法来处理自定义类型。在panic hook中,如果您可以向下转换到自定义类型,您可以确定恐慌的起源。

    询问我们推荐或查找书籍、工具、软件库的问题,教程或其他非站点资源与堆栈溢出无关,因为它们往往会吸引固执己见的答案和垃圾邮件-我已经从您的其他好问题中删除了这些内容。总的来说,我认为您的看法不正确<代码>预期
    不应用于用户可能合理看到或导致的错误。它的目的是针对程序员级错误。其他一切都应该由你的程序来处理。@Shepmaster我明白了。我写了“我发现expect()对于编写快速代码非常有用”。。。您是对的,真正的错误处理应该在非平凡的脚本中使用。
    expect
    可以通过宏来改进。
    use std::panic::set_hook;
    
    fn main() {
        set_hook(Box::new(|info| {
            if let Some(s) = info.payload().downcast_ref::<String>() {
                println!("{}", s);
            }
        }));
    
        // Displays: "My error message":
        Option::None::<i32>.expect("My error message");
    }
    
    #![feature(panic_info_message)]
    
    use std::panic::set_hook;
    
    fn main() {
        set_hook(Box::new(|info| {
            println!("{:?}", info.message().unwrap());
        }));
    
        Option::None::<i32>.expect("My error message");
    }