我可以收集目录列表并在发生错误时不停止的情况下迭代它们吗?

本文关键字:情况下 不停止 迭代 错误 列表 我可以 | 更新日期: 2023-09-27 17:57:06

如果我遍历目录列表,我必须将try{}catch{}块放在循环之外。如果我把它放在循环中,在我有机会抓住它之前,该目录可能会发生错误。不过,将 try catch 放在循环中是理想的方案,因为它允许我捕获错误并继续进入下一个目录。

但是由于我被迫将 try catch 放在外面,它会在目录上出错,并且不会继续到下一个目录。

try
{
    foreach (string subDir in Directory.GetDirectories(path))
    {
        queue.Enqueue(subDir);
    }
}
catch (Exception ex)
{
   Console.Error.WriteLine(ex);
}

关于我可以做些什么来获取每个目录的任何想法,一次一个?

我可以收集目录列表并在发生错误时不停止的情况下迭代它们吗?

我假设您收到的错误是在调用Directory.GetDirectories(path)时。 如果是这种情况,请在进入循环之前在 try/catch 中执行此操作。

string[] directories;
try
{
    directories = Directory.GetDirectories(path);
}
catch (Exception ex)
{
   Console.Error.WriteLine(ex);
}
foreach (string subDir in directories)
{
    queue.Enqueue(subDir);
}

Queue<T>.Enqueue不会引发任何异常,因此您不需要 try/catch 块。

请注意,您需要在引发异常后return;或检查directories是否为 null,否则输入foreach将引发NullReferenceException

好吧,没有什么能阻止你使用像这样的两个try/catch

try
{
    foreach (string subDir in Directory.GetDirectories(path))
    {
        try
        {
            queue.Enqueue(subDir);
        }
        catch (Exception ex)
        {
            //Do whatever you want with the error.
        }
    }
}
catch (Exception ex)
{
   Console.Error.WriteLine(ex);
}

您需要捕获特定错误吗?如果没有,请快速失败。Directory.Exists 将在抛出的错误和不存在的路径上返回 false:

if(!Directory.Exists(path) {
    //error handling here
}
foreach (string subDir in Directory.GetDirectories(path))
{
    queue.Enqueue(subDir);
}

更正:请参阅下面关于目录访问的 MrBlue 评论。