Rustunwrap- 全能的错误处理库

一、 什么是Rustunwrap

Rustunwrap是一个轻量级的处理rust语言中错误的crate。Rust编程语言通过Result类型来处理错误,使用Rustunwrap可以使处理Result类型的代码更加简介。它是一个通用的处理Result类型的crate,可以应用在各种场景中。

二、 Rustunwrap的优点

1、 简单易用:

    let data = fetch_data() ?;

有了Rustunwrap之后,可以将上述代码简化为:

    let data = unwrap!(fetch_data());

2、 统一:

在Rust代码中使用unwrap方法编写错误处理代码时,代码风格不统一,Rustunwrap解决了这个问题,使你的代码风格更加整洁。

3、 优雅的错误信息提示:

使用unwrap!宏的时候,你可以自定义你的错误提示:

    let data = unwrap!(fetch_data(), "Failed to fetch data");

三、 Rustunwrap常用方法

unwrap!

unwrap!宏是Rustunwrap中最常用的一个,它允许我们以更简洁的方式处理Result类型的错误,如果Result类型为Ok,则返回Ok中的值,否则它会panic并打印出错误消息。

    let data = unwrap!(fetch_data());

unwrap!宏还可以附加错误消息,如下所示:

    let data = unwrap!(fetch_data(), "Failed to fetch data");

expect!

expect!宏与unwrap!宏基本相同,它们之间的区别在于,如果unwrap!宏触发错误,它会打印默认消息 。而expect!宏可以自定义错误消息,这使得错误消息更易读。

    let data = expect!(fetch_data(), "Failed to fetch data: {}", e);

chain!

通常情况下,我们使用map或and_then方法对返回值进行操作,这使代码更加整洁。但是,当操作多个可能失败的函数时,这会变得很繁琐。Chain!宏在这种情况下非常有用。

    let res = chain!(
        fetch_data().map(|data| process_data(data)),
        fetch_config().map(|cfg| process_cfg(cfg))
    );

ensure!

如果需要在结果为Ok时执行某些操作,但是在结果为Err时,确保钩子函数被执行,则可以使用ensure!宏:

    let mut config = Config::new()?;
    ensure!(config.is_valid(), "Invalid configuration")?;
    config.save()?;

unwrap_err!

unwrap_err!宏与unwrap!宏相似,它返回结果的Err部分。如果结果是Ok,则它会panic。

    let mut config = Config::new()?;
    config.set("name", "John")?;
    let value = unwrap_err!(config.get("wrong_name"));
    println!("{}", value);

四、 完整代码示例

    use rustunwrap::*;

    fn fetch_data() -> Result{
        Ok(String::from("data"))
    }

    fn fetch_config() -> Result{
        Err(String::from("Failed to fetch"))
    }

    fn config_ok(cfg: String) -> Result {
        Ok(cfg)
    }

    fn process_data(data: String) -> String {
        data
    }

    fn process_cfg(cfg: String) -> String{
        cfg
    }

    struct Config {}

    impl Config {
        fn new() -> Result{
            Ok(Self{})
        }

        fn is_valid(&self) -> bool{
            true
        }

        fn set(&mut self, key: &str, value: &str) -> Result {
            Ok(())
        }

        fn get(&self, key: &str) -> Result{
            Err(String::from("Invalid key"))
        }

        fn save(&self) -> Result{
            Ok(())
        }
    }

    fn main() {
        let data = unwrap!(fetch_data());
        println!("{}", data);

        let mut config = Config::new().unwrap();
        ensure!(config.is_valid(), "Invalid configuration").unwrap();
        config.save().unwrap();

        let res = chain!(fetch_data().map(|data| process_data(data)),fetch_config().map(|cfg| process_cfg(cfg)));
        println!("{}", res.unwrap_err());

        let value = unwrap_err!(config.get("wrong_name"));
        println!("{}", value);
    }

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/183597.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-25 05:48
下一篇 2024-11-25 05:48

相关推荐

发表回复

登录后才能评论