Error handling 传播错误的正确方法是什么?
我正在尝试学习Rust,但是当我为我的一种类型实现Error handling 传播错误的正确方法是什么?,error-handling,rust,Error Handling,Rust,我正在尝试学习Rust,但是当我为我的一种类型实现fmt::Display特性时,我遇到了一个困难。我想这样做: fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "("); some_helper_function(self.t1, self.ctx, f); write!(f, " "); some_helper_function(self.t2, self.
fmt::Display
特性时,我遇到了一个困难。我想这样做:
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "(");
some_helper_function(self.t1, self.ctx, f);
write!(f, " ");
some_helper_function(self.t2, self.ctx, f);
write!(f, ")")
}
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "("));
try!(some_helper_function(self.t1, self.ctx, f));
try!(write!(f, " "));
try!(some_helper_function(self.t2, self.ctx, f));
try!(write!(f, ")"))
}
所有这些函数都返回
fmt::Result
,但这将被忽略。向上传播错误结果的正确方法是什么?对于每个函数调用,检查返回是否为Err
对象。如果它是从函数返回的Err
对象,如果不是,则继续。
标准库中有一个方便的宏,名为,它正是这样做的
所以你的代码会变成这样:
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "(");
some_helper_function(self.t1, self.ctx, f);
write!(f, " ");
some_helper_function(self.t2, self.ctx, f);
write!(f, ")")
}
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "("));
try!(some_helper_function(self.t1, self.ctx, f));
try!(write!(f, " "));
try!(some_helper_function(self.t2, self.ctx, f));
try!(write!(f, ")"))
}
是如何解决这个问题的关键。不过,我想补充一下这一部分:
所有这些函数都返回fmt::Result
,但这将被忽略
请注意,编译器非常努力地帮助您:
fn important() -> Result<u8, ()> {
Err(())
}
fn main() {
important();
}
通过将以下内容添加到板条箱中,您甚至可以使所有警告变成错误:
#![deny(unused_must_use)]
Err对象-迂腐,Err
是Result
enum的变体。try代码>是这样做的一种方式。使用?
代替:即编写!(f,“(”);