如何在C++中无异常使用recursive_directory_iterator
无需异常使用std::filesystem::recursive_directory_iterator的方法
要避免recursive_directory_iterator因路径不存在抛出异常,你可以使用它的非抛出构造函数重载——带std::error_code参数的版本,构造时不会抛出异常,而是通过错误码对象返回初始化结果。
修改后的示例代码
#include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { std::error_code ec; // 传入错误码参数,构造迭代器时不抛出异常 auto dir_iter = fs::recursive_directory_iterator("I-dont-exist", ec); // 先检查迭代器是否初始化成功 if (ec) { std::cout << "初始化失败:" << ec.message() << '\n'; return 1; } // 正常遍历目录项 for (auto const& dir_entry : dir_iter) { std::cout << dir_entry.path() << '\n'; } return 0; }
额外优化:忽略权限不足的情况
如果遍历过程中遇到权限不足的目录,不想因此中断遍历,可以加上directory_options::skip_permission_denied选项:
auto dir_iter = fs::recursive_directory_iterator( "I-dont-exist", fs::directory_options::skip_permission_denied, ec );
关键说明
- 构造时传入的
std::error_code对象会在初始化失败时被设置对应错误值(比如路径不存在时为std::errc::no_such_file_or_directory),可以通过ec.message()获取可读的错误描述。 - 不能直接用范围for循环创建临时迭代器(原代码的写法),因为临时对象的默认构造(不带错误码)仍会抛出异常,必须显式构造并检查错误码后再遍历。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

