在Rust中有大量关于错误处理的文章,但它们似乎都导致返回一个导致恐慌或类似错误的错误对象。
我想查看用户输入的错误,所以我不能只将它传递到堆栈中,我不能只是恐慌(它几乎不是用户友好的)
目前我正在使用带有if let
块的空else
来处理这个问题,但它看起来很丑陋而且很尴尬。在Option
和Result
中的便利方法中,是否有任何东西可以让我称之为最终方法?
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");
};
}
答案 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);
}