You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:12:45