Rust 中前置条件/参数检查的简单错误处理

问题描述 投票:0回答:1

有没有一种方法可以像使用

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 中进行错误处理以及常见的陷阱是什么? 没有解决我的错误处理中的“打印错误”部分。

rust error-handling
1个回答
0
投票

深入阅读 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

这对于这种情况非常有效!

© www.soinside.com 2019 - 2024. All rights reserved.