Can you please help me to handle exceptions in this snippet of C++? I would like to collect error like permission denied as a new entry in the vector differences.
~~~
std::vector<FileDiff> compare_directories(const fs::path &dir1, const fs::path &dir2)
{
    std::queue<std::pair<fs::path, fs::path>> dirs_queue;
    dirs_queue.push({dir1, dir2});

    std::vector<FileDiff> differences;

    while (!dirs_queue.empty())
    {
        auto [current_dir1, current_dir2] = dirs_queue.front();
        dirs_queue.pop();

        std::set<std::string> entries1, entries2;
        for (const auto &entry : fs::directory_iterator(current_dir1))
        {
            if (!fs::is_directory(entry))
                entries1.insert(entry.path().filename());
        }
        for (const auto &entry : fs::directory_iterator(current_dir2))
        {
            if (!fs::is_directory(entry))
                entries2.insert(entry.path().filename());
        }

        for (const auto &entry : entries1)
        {
            if (entries2.find(entry) == entries2.end())
            {
                differences.push_back({(current_dir1 / entry).string(), fs::path(), "", ""});
            }
            else
            {
                auto file1_path = current_dir1 / entry;
                auto file2_path = current_dir2 / entry;
                if (fs::file_size(file1_path) != fs::file_size(file2_path))
                {
                    differences.push_back({file1_path, file2_path, "Size differs", ""});
                }
                else
                {
                    auto hash1 = hash_file(file1_path);
                    auto hash2 = hash_file(file2_path);
                    if (hash1 != hash2)
                    {
                        differences.push_back({file1_path, file2_path, hash1, hash2});
                    }
                }
            }
        }
        for (const auto &entry : entries2)
        {
            if (entries1.find(entry) == entries1.end())
            {
                differences.push_back({fs::path(), (current_dir2 / entry).string(), "Folder not found in path1", ""});
            }
        }

        for (const auto &entry : fs::directory_iterator(current_dir1))
        {
            if (fs::is_directory(entry))
            {
                auto other_entry = current_dir2 / entry.path().filename();
                if (fs::exists(other_entry))
                {
                    dirs_queue.push({entry.path(), other_entry});
                }
                else
                {
                    differences.push_back({entry, other_entry, "", "Folder not found in path2"});
                }
            }
        }
        // this looks at the second folder if there are subfolders missing in the first folder
        for (const auto &entry : fs::directory_iterator(current_dir2))
        {
            if (fs::is_directory(entry))
            {
                auto other_entry = current_dir1 / entry.path().filename();
                if (!fs::exists(other_entry))
                {
                   differences.push_back({entry, other_entry, "", ""});
                }
            }
        }
    }

    return differences;
}