代码之家  ›  专栏  ›  技术社区  ›  Fredrick Brennan

有没有办法让expect()输出更友好的消息?

  •  1
  • Fredrick Brennan  · 技术社区  · 6 年前

    我发现 expect() 对用户非常不友好。考虑下面这个简短的例子。。。

    use std::env;
    
    fn main() {
        let imagefn = env::args().skip(1).next().expect("Filename not provided.");
        println!("{}", imagefn);
    }
    

    错误在于:

    thread 'main' panicked at 'Filename not provided.', libcore/option.rs:960:5
    note: Run with `RUST_BACKTRACE=1` for a backtrace.
    

    期望() 对于编写快速代码非常有用,但希望我可以输出类似这样的内容:

    Filename not provided.
    

    1. 有没有办法让我超驰 期望()
    2. 为什么 期望()
    2 回复  |  直到 6 年前
        1
  •  5
  •   Shepmaster Lukas Kalbertodt    6 年前

    你可以用 set_hook 改变恐慌信息。例子:

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

    你也可以使用 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");
    }
    

        2
  •  5
  •   ljedrz    6 年前

    expect() panic!() :

    pub fn expect(self, msg: &str) -> T {
        match self {
            Some(val) => val,
            None => expect_failed(msg) // expect_failed calls panic!()
        }
    }
    

    理想情况下,您应该使用 ? Option Result 以便能够以更优雅的方式处理此类问题。

    如果您只想返回一个更友好的消息并退出,您可以实现自己的函数打印该消息并以 process::exit