匹配特定的错误类型

use*_*632 15 error-handling rust

我试图在一个文件中读取,直到每次结束2个字节.我想抓住EOF错误.我有这个代码:

loop {
    let binary = match file.read_be_u16() {
        Ok(binary) => binary,
        Err(e) => panic!("Can't read from file: {}, err {}", filename, e),
                  // Can I catch this EOF error here?
    };
    println!("{:?}", binary);
}
Run Code Online (Sandbox Code Playgroud)

sar*_*old 11

至少rustc版本rustc 1.17.0(56124baa9 2017-04-24)不允许解构使用ErrChris Morgan的答案.我发现这个工作:

Err(ref e) if e.kind() == std::io::ErrorKind::NotFound => true,
Err(e) => { println!("{:?}", e); false }
Ok(_) => false,
Run Code Online (Sandbox Code Playgroud)


Chr*_*gan 7

您可以使用模式匹配的一些更高级功能将类型作为模式的一部分进行匹配:

Err(IoError { kind: IoErrorKind::EndOfFile, .. }) => break,
Err(e) => panic!("Can't read from file: {}, err {}", filename, e),
Run Code Online (Sandbox Code Playgroud)

第一个变种的意思是"一个Err包含IoError这里kindIoErrorKind::EndOfFile和其他所有字段都是你喜欢的." 第二个则表示"任何其他Err,将包含的值绑定到变量名称e".

  • @sarnold:`std :: io :: Error`现在隐藏了它的字段,因此您无法编辑`Error`对象的类型; 但是,它确实有一个*方法*[`kind()`](http://doc.rust-lang.org/std/io/struct.Error.html#method.kind)返回类型.现在我推荐一些更像`Err(ref e)的东西,如果e.kind()== io :: ErrorKind :: EndOfFile => break,`. (9认同)

kev*_*arr 7

我发现...

Err(e) => match e.kind() {
    EndOfFile => break,
    SomeOtherError => do_something(),
    _ => panic!("Can't read from file: {}, err {}", filename, e),
},
Run Code Online (Sandbox Code Playgroud)

};

......比......更具可读性

Ok(binary) => binary,
Err(ref e) if e.kind() == EndOfFile => break,
Err(ref e) if e.kind() == SomeOtherError => do_something(),
Err(e) => panic!("Can't read from file: {}, err {}", filename, e),
Run Code Online (Sandbox Code Playgroud)

(我不确定我们可能会遇到什么其他错误......)

在匹配守卫可能不相同的其他情况下——我们重复的方式e.kind()——我们不能使用嵌套的match.

这适用于 Rust 1.25。


use*_*632 0

我想到了。我更改了这一行来检查错误类型!希望这对其他人有帮助。

Err(e) => if e.kind == IoErrorKind::EndOfFile { break } else { panic!("Can't read from file: {}, err {}", filename, e) },
Run Code Online (Sandbox Code Playgroud)