繁体   English   中英

如何在Rust中传播错误?

[英]How can I propagate the errors in Rust?

有没有一种很好的方法可以在Rust中传播错误? 例如,我想重构以下代码以避免嵌套错误:

.for_each(|record| {
    match f1() {
        Ok(a1) => match f2() {
            Ok(a2) => match f3() {
                Ok(_) => {}
                Err(e) => {
                    eprintln!("Error: {}", e);
                }
            },
            Err(e) => {
                eprintln!("Error: {}", e);
            }
        },
        Err(e) => {
            eprintln!("Error: {}", e);
        }
    };
    Ok(())
})

问题不是重复的,因为我有一个for_each运算符,这会使我的情况复杂化。 当我放? f2我实际上收到以下错误:

the trait `std::convert::From<std::io::Error>` is not implemented for `grpcio::error::Error`

您可以在成功场景链中的功能and_then和他们的错误地图map_err

像这里,您可以将它们链接:

let result = f1().and_then(|_| {
    f2().and_then(|_| {
        f3().and_then(|_| {
            println!("All functions are succeed");
            Ok(())
        })
    })
});

如果发生错误,您将在此处获得result变量。

然后,可以使用if let Err(error)语句将该错误与之匹配,如下所示:

if let Err(error) = result {
    println!("Problem occurred: {:?}", error);
};

也可以try!更高的错误率try! 宏还是? 运算符如下:

fn throw_error() -> Result<String, MyError> {
    let string_val = "will not be returned".to_string();

    Err(MyError::thrownError)?;
    Ok(string_val)
}

在这里,您可以测试并进行更多操作以了解这些概念。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM