如何编写显示错误并退出程序的函数的签名?

时间:2016-03-27 16:59:15

标签: rust

在Rust中有大量关于错误处理的文章,但它们似乎都导致返回一个导致恐慌或类似错误的错误对象。

我想查看用户输入的错误,所以我不能只将它传递到堆栈中,我不能只是恐慌(它几乎不是用户友好的)

目前我正在使用带有if let块的空else来处理这个问题,但它看起来很丑陋而且很尴尬。在OptionResult中的便利方法中,是否有任何东西可以让我称之为最终方法?

unwrap_or_else只是抱怨闭包返回值是错误的类型。

use std::io::{stderr, Write};
use std::env;
use std::process::exit;

fn error_out(e: &str) {
    writeln!(&mut stderr(), "{}", e).expect(format!("Failed to print error: {}", e).as_str());
    exit(1);
}

fn main() {
    if let Some(filename) = env::args().nth(1) {} else {
        error_out("No filename provided");
    };
}

1 个答案:

答案 0 :(得分:2)

您可以将返回类型!添加到error_out,以表明它不会返回。然后它的类型无关紧要,可以在unwrap_or_else中调用它:

use std::process::exit;

fn error_out(e: &str) -> ! {
    writeln!(&mut stderr(), "{}", e).expect(format!("Failed to print error: {}", e).as_str());
    exit(1);
}

fn main() {
    let filename: String = env::args().nth(1).unwrap_or_else(|| error_out("No filename provided"));
    println!("{}", filename);
}