如何处理Read :: read_to_end方法中的错误?

时间:2016-11-23 09:12:58

标签: error-handling rust

我正在读取文件并解析数据:

fn main() {
    parse_torrentfile("ubuntu-16.04.1-server-amd64.torrent");
}

fn parse_file(filename: &'static str) {
    let mut f = File::open(&Path::new(filename)).unwrap();
    let mut v: Vec<u8> = Vec::new();
    let file_content = f.read_to_end(&mut v);
    println!("{:?}", file_content);
}

如果存在ubuntu-16.04.1-server-amd64.torrent,则效果很好,但如果不存在,则会出现此错误:

 thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { repr: Os { code: 2, message: "No such file or directory" } }'

如何打印&#34;不存在文件&#34;或者&#34;处理文件解析&#34;?

2 个答案:

答案 0 :(得分:1)

可能最常用的方法是将结果传播到parse_file之外,在main中打印错误。

use std::fs::File;
use std::io::{Read, Error as IoError};
use std::path::Path;

fn main() {
    match parse_file("ubuntu-16.04.1-server-amd64.torrent") {
        Err(e) => println!("{}", e),
        _ => {}
    }
}

fn parse_file(filename: &'static str) -> Result<(), IoError> {
    let mut f = File::open(&Path::new(filename))?;
    let mut v: Vec<u8> = Vec::new();
    let file_content = f.read_to_end(&mut v);
    println!("{:?}", file_content);

    Ok(())
}

如果你想在一行中打印错误然后传播它,你可以这样做:

fn main() {
    parse_file("ubuntu-16.04.1-server-amd64.torrent");
}

fn parse_file(filename: &'static str) -> Result<(), IoError> {
    let mut f = File::open(&Path::new(filename)).map_err(|e| {
            println!("{}", e);
            e
        })?;

    let mut v: Vec<u8> = Vec::new();
    let file_content = f.read_to_end(&mut v);
    println!("{:?}", file_content);

    Ok(())
}

答案 1 :(得分:1)

您应该在Result上进行匹配,而不是调用unwrap()expect()。一旦出现错误,您可以将其打印出来,或者如果您想以不同方式处理不同的错误,请查看ErrorKind

use std::fs::File;
use std::path::Path;
use std::io::Read;

fn main() {
    parse_file("doesnt_exist.txt");
}

fn parse_file(filename: &'static str) {
    let mut f = match File::open(&Path::new(filename)) {
        Ok(f) => f,
        Err(e) => {
            use std::io::ErrorKind::*;
            println!("Got error: {}", e);
            match e.kind() {
                NotFound => {
                    println!("File not found");
                }
                k => {
                    println!("Error: {:?}", k);
                }
            }
            return;
        }
    };
    let mut v: Vec<u8> = Vec::new();
    let file_content = f.read_to_end(&mut v);

    println!("{:?}", file_content);
}

Playground