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

时间:2015-09-05 11:01:06

标签: 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.ctx, f);
    write!(f, ")")
}

所有这些函数都返回fmt::Result,但这将被忽略。向上传播错误结果的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

对于每个函数调用,检查返回是否为Err对象。如果它是从函数返回的Err对象,如果不是,则继续。 标准库中有一个方便的宏,称为try!,它就是这样做的。

所以你的代码会变成这样:

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, ")"))
}

答案 1 :(得分:0)

Andrea P's answer是如何解决这个问题的。我想在这部分添加:

  

所有这些函数都返回use strict; use warnings; use v5.10; die "No file names given\n" unless @ARGV; for my $file (reverse(@ARGV)) { next unless -f $file; open(my $fh, '<', $file) or die "Can't open file [$file]: $!\n"; while (<$fh>) { chomp; say; } close($fh); } ,但这将被忽略。

请注意,编译器在此尝试很难帮助您:

fmt::Result

默认情况下会产生此警告:

fn important() -> Result<u8, ()> {
    Err(())
}

fn main() {
    important();
}

您甚至可以通过将其添加到您的包装箱中来使所有警告变为错误:

warning: unused result which must be used, #[warn(unused_must_use)] on by default
     important();
     ^~~~~~~~~~~~
相关问题