C++中抛出异常后如何继续for循环的下一次迭代?
解决std::filesystem::recursive_directory_iterator遍历C盘的异常问题
你碰到的异常出在迭代器递增阶段——范围for会自动处理迭代器的递增,这部分不在你第一种写法的try/catch范围内,所以catch根本抓不到错误;第二种写法把整个循环包起来,虽然能捕获异常,但会直接终止遍历,没法继续往下走。
要实现“遇到异常就跳过、继续迭代”的需求,得手动控制迭代器,把迭代器的递增操作放到try块里,这样才能捕获遍历过程中抛出的异常。以下是可行的写法:
#include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { try { fs::recursive_directory_iterator it("C:\\"); while (it != fs::recursive_directory_iterator{}) { try { std::cout << *it << std::endl; ++it; // 迭代器递增操作放在try块内,捕获可能的异常 } catch (const fs::filesystem_error& e) { std::cerr << "跳过错误路径: " << e.what() << std::endl; ++it; // 出错后仍尝试移动到下一个元素 } } } catch (const fs::filesystem_error& e) { std::cerr << "初始化迭代器失败: " << e.what() << std::endl; } return 0; }
关键说明:
- 放弃范围for循环,手动创建并管理迭代器,这样能精准控制迭代器递增的时机
- 将迭代器的解引用(输出路径)和递增操作都放在内部try块中,确保遍历过程中抛出的异常能被捕获
- 捕获异常后手动递增迭代器,保证遍历能继续进行
- 外部try块处理迭代器初始化阶段的错误(比如C盘无法访问的情况)
另外需要注意:遍历C盘通常需要管理员权限,系统中很多受保护目录(如System Volume Information、Windows系统目录)普通用户无法访问,这是触发异常的主要原因,运行程序时建议以管理员身份启动。
内容的提问来源于stack exchange,提问作者Calabran
相关产品推荐
相关产品推荐

