Error handling 传播错误的正确方法是什么?

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.

我正在尝试学习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.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,“(”);