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

Rust 如何编写显示错误并退出程序的函数的签名?,rust,Rust,关于Rust中的错误处理有很多文章,但它们似乎都会导致返回错误对象,从而引起恐慌或类似的情况 我想检查用户输入是否有错误,所以我不能只是将其传递到堆栈中,也不能只是惊慌失措,这很难对用户友好 目前,我使用一个空的if-let和一个else块来处理这个问题,但它看起来很丑陋和笨拙。在选项和结果中的大量方便方法中,是否没有任何东西允许我调用最终方法 unwrap_或_else只是抱怨闭包返回值的类型错误 use std::io::{stderr, Write}; use std::env; use

关于Rust中的错误处理有很多文章,但它们似乎都会导致返回错误对象,从而引起恐慌或类似的情况

我想检查用户输入是否有错误,所以我不能只是将其传递到堆栈中,也不能只是惊慌失措,这很难对用户友好

目前,我使用一个空的if-let和一个else块来处理这个问题,但它看起来很丑陋和笨拙。在选项和结果中的大量方便方法中,是否没有任何东西允许我调用最终方法

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

您可以添加退货类型!出错以指示它不返回。那么它的类型就无关紧要了,可以在“展开”或“其他”中调用它:

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