[英]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.