Error handling 如何处理Read::Read_to_end方法中的错误?

Error handling 如何处理Read::Read_to_end方法中的错误?,error-handling,rust,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 f

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

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);
}

如何打印“不存在文件”或“处理文件解析”

最惯用的方法可能是在
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(())
}
使用std::fs::File;
使用std::io::{Read,Error as IoError};
使用std::path::path;
fn main(){
匹配解析_文件(“ubuntu-16.04.1-server-amd64.torrent”){
Err(e)=>println!(“{}”,e),
_ => {}
}
}
fn parse_文件(文件名:&'static str)->结果{
让mut f=File::open(&Path::new(filename))?;
让mut v:Vec=Vec::new();
让文件内容=f.read\u to\u end(&mut v);
println!(“{:?}”,文件内容);
好(())
}
如果要在一行中打印错误,然后传播错误,可以执行以下操作:

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(())
}
fn main(){
解析_文件(“ubuntu-16.04.1-server-amd64.torrent”);
}
fn parse_文件(文件名:&'static str)->结果{
让mut f=File::open(&Path::new(filename)).map_err(| e |{
println!(“{}”,e);
E
})?;
让mut v:Vec=Vec::new();
让文件内容=f.read\u to\u end(&mut v);
println!(“{:?}”,文件内容);
好(())
}

您应该匹配
结果,而不是调用
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);
}
使用std::fs::File;
使用std::path::path;
使用std::io::Read;
fn main(){
解析文件(“doesnu exist.txt”);
}
fn parse_文件(文件名:&'static str){
让mut f=match File::open(&Path::new(filename)){
Ok(f)=>f,
错误(e)=>{
使用std::io::ErrorKind::*;
println!(“获取错误:{}”,e);
匹配e.kind(){
未找到=>{
println!(“未找到文件”);
}
k=>{
println!(“错误:{:?}”,k);
}
}
返回;
}
};
让mut v:Vec=Vec::new();
让文件内容=f.read\u to\u end(&mut v);
println!(“{:?}”,文件内容);
}

尝试
.expect(“文件不存在”)
而不是
.unwrap()
@ljedrz Thx,但它也
线程“main”在“文件不存在”时惊慌失措:错误{repr:Os{code:2,消息:“没有这样的文件或目录”},../src/libcore/result.rs:799
,我只想打印
文件不存在
,不可能吗?读一读。这个错误没有什么特别之处。这个答案中有很多非惯用的锈迹。如果只关心一个分支,则匹配的
应该是
if let
。无需为
v
指定类型
map
map\u err
不应该用于打印值之类的副作用。@Shepmaster当我说“惯用”时,我只是说传播错误,而不是我在OP中留下的几乎未触及的其余代码。然后,在我看来,OP正在寻找一种方法来完成工作,因此,我提出了第二种解决方案(我知道这有点难看)。记住,答案不仅仅针对OP。答案适用于每个找到此问答的人。这就是为什么我努力使我的答案尽可能地道(或者无论出于什么原因,都要清楚地指出答案不地道)。@Shepmaster也许你是对的,但我不想疏远那些重写了一半代码的海报,给他们一大堆他们没问过的问题的答案。我更愿意直接回答OP提出的问题。[还有另一个代码查看网站顺便说一句]不过我会记住你的观察结果。没有必要指定
v
的类型。没有,但我不认为显式有什么问题(它来自于问题).请记住,答案不仅仅针对OP。答案适用于每一个找到此问答的人。这就是为什么我要努力使我的答案尽可能地道(或者清楚地指出答案并非出于任何原因)。