有没有一种方法可以像使用
expect
一样简单地编写错误处理?我经常想验证输入并在输入有效时中止程序并显示错误消息。
带有
expect
的示例:
let url = Url::parse("sdfsf")
.expect("Error parsing URL");
// Output:
// thread 'main' panicked at src\main.rs:41:35:
// Error parsing URL: RelativeUrlWithoutBase
从这个答案我认为我不应该使用
expect
来处理实际的用户错误,那么我如何才能通过面向用户的Display
来复制这种简单性?
我想出的最好的办法是
unwrap_or_else
:
let url = Url::parse("sdfsf")
.unwrap_or_else(|e| {
eprintln!("Error parsing URL: {}", e);
std::process::exit(1);
});
// Output:
// Error parsing URL: relative URL without a base
我已经读到退出不会调用析构函数,所以也许这会在以后给我带来问题。
相关但无帮助的问题:在 Rust 中使用 unwrap_or_else 进行错误处理,更紧凑,更容易阅读 Rust 错误处理(实际上都没有回答他们的标题问题)。 如何在 Rust 中进行错误处理以及常见的陷阱是什么? 没有解决我的错误处理中的“打印错误”部分。
深入阅读 Chayim Friedman 的答案,我意识到我可以编写自己的 unwrap,它会因失败而终止:
use url::Url;
pub trait UnwrapExt<T> {
fn unwrap_or_error(self, msg: &str) -> T;
}
impl<T, E: std::fmt::Display> UnwrapExt<T> for Result<T, E> {
fn unwrap_or_error(self, msg: &str) -> T {
self.unwrap_or_else(|err| {
eprintln!("{msg}: {}", { err });
std::process::exit(1);
})
}
}
fn main() {
let url = Url::parse("sdsdf")
.unwrap_or_error("Error parsing URL");
println!("{}", url.scheme());
}
// Output:
// Error parsing URL: relative URL without a base
这对于这种情况非常有效!