Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Error handling 为什么fs::read_dir()会在结果<;上返回迭代器;直接输入,错误>;_Error Handling_Rust - Fatal编程技术网

Error handling 为什么fs::read_dir()会在结果<;上返回迭代器;直接输入,错误>;

Error handling 为什么fs::read_dir()会在结果<;上返回迭代器;直接输入,错误>;,error-handling,rust,Error Handling,Rust,此代码在我的系统上打印两个Oks: use std::fs; fn main() { fs::read_dir("/home").unwrap().for_each(|e| { println!("{:?}", e); }); } 在使用元素之前,我需要展开DirEntry元素 各国的文件: 在目录中的条目上返回迭代器 迭代器将生成的实例。初始构造迭代器后可能会遇到新错误 文档中提到的是什么样的错误?打开结果是否安全?f

此代码在我的系统上打印两个
Ok
s:

use std::fs;

fn main() {
    fs::read_dir("/home").unwrap().for_each(|e| {
        println!("{:?}", e);
    });
}
在使用
元素之前,我需要
展开
DirEntry
元素

各国的文件:

在目录中的条目上返回迭代器

迭代器将生成的实例。初始构造迭代器后可能会遇到新错误


文档中提到的是什么样的错误?
打开
结果是否安全?

fs::read_dir
打开目录时可能会遇到错误,例如,如果目录不存在或用户没有读取该目录的权限。但是,即使在打开目录后,也可能发生任意数量的错误:

  • 该目录可能已被删除
  • 目录的权限可能已更改
  • 基础存储介质可能存在IO错误(例如硬盘驱动器故障)
  • 目录可能位于已删除的可移动驱动器(或已断开连接的网络驱动器)上
  • 或操作系统可能给出的任何其他操作错误
fs::read_dir
给出的结果中不可能返回此错误;相反,我们必须在迭代器本身中给出它们。这就是迭代器产生
Result
类型项的原因,这样程序员就有可能捕获并处理这些错误


至于是否可以安全地
展开
结果,只有确定结果不是错误时才是真正安全的(否则代码会死机)。在许多情况下,例如在进行原型设计时,您可能不关心代码是否崩溃,但在Rust中编写正确的应用程序时,您应该避免
unwrap
,而是依赖于正确的错误处理和错误传播

这是我在使用可能产生错误的迭代器时通常使用的模式:

使用std:{fs,io};
fn read_dir_和dou stuff()->结果{
对于fs::read_dir(“/home”)中的条目{
//                            ^
//v---------------自动返回错误
让进入=进入?;
//…做点什么
println!(“{:?}”,条目);
}
好(())
}
fn main(){
如果让Err(Err)=read_dir_和_do_stuff(){
//处理错误
println!(“发生错误:{}”,err);
回来
}
}

您还可以使用以下方法,例如,如果您想在

fs::read_dir
中使用链接而不是
,则在打开目录时可能会遇到错误,例如,如果目录不存在或用户没有读取该目录的权限。但是,即使在打开目录后,也可能发生任意数量的错误:

  • 该目录可能已被删除
  • 目录的权限可能已更改
  • 基础存储介质可能存在IO错误(例如硬盘驱动器故障)
  • 目录可能位于已删除的可移动驱动器(或已断开连接的网络驱动器)上
  • 或操作系统可能给出的任何其他操作错误
fs::read_dir
给出的结果中不可能返回此错误;相反,我们必须在迭代器本身中给出它们。这就是迭代器产生
Result
类型项的原因,这样程序员就有可能捕获并处理这些错误


至于是否可以安全地
展开
结果,只有确定结果不是错误时才是真正安全的(否则代码会死机)。在许多情况下,例如在进行原型设计时,您可能不关心代码是否崩溃,但在Rust中编写正确的应用程序时,您应该避免
unwrap
,而是依赖于正确的错误处理和错误传播

这是我在使用可能产生错误的迭代器时通常使用的模式:

使用std:{fs,io};
fn read_dir_和dou stuff()->结果{
对于fs::read_dir(“/home”)中的条目{
//                            ^
//v---------------自动返回错误
让进入=进入?;
//…做点什么
println!(“{:?}”,条目);
}
好(())
}
fn main(){
如果让Err(Err)=read_dir_和_do_stuff(){
//处理错误
println!(“发生错误:{}”,err);
回来
}
}

您也可以使用以下方法,如果您想在中使用链接而不是

使用
的话,请通过
边沿
快速查看发动机罩下的以下内容(经过一些修剪):

因此readdir需要多个系统调用。检查
mangetdents64
告诉我们这是特定于linux的,POSIXAPI是
readdir
,它的主页上依次显示:

函数的作用是:返回一个指向dirent结构的指针,该结构表示dirp指向的目录流中的下一个目录项。到达目录流结尾或发生错误时,返回NULL


这告诉我们,遍历目录是分多个步骤执行的,每个步骤都可能返回一个错误。因此,使其生锈的正确方法是为每个步骤返回
结果

通过
strace
快速查看发动机罩下显示以下内容(经过一些修整):

因此readdir需要多个系统调用。检查
mangetdents64
告诉我们这是特定于linux的,POSIXAPI是
readdir
,它的主页上依次显示:

函数的作用是:返回一个指向dirent结构的指针,该结构表示dirp指向的目录流中的下一个目录项。到达目录流结尾或发生错误时,返回NULL

这告诉我们的是走路
$ strace ./target/debug/readdir-test
openat(AT_FDCWD, "/home", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
getdents64(3, /* 4 entries */, 32768)   = 104
getdents64(3, /* 0 entries */, 32768)   = 0
+++ exited with 0 +++