C# 我可以收集目录列表并在发生错误时不停止遍历它们吗?

C# 我可以收集目录列表并在发生错误时不停止遍历它们吗?,c#,winforms,C#,Winforms,如果我在目录列表中循环,我必须将try{}catch{}块放在循环之外。如果我把它放在循环中,在我抓住它之前,这个目录上可能会发生错误。不过,将try-catch放在循环中是理想的方案,因为这样可以捕获错误并继续到下一个目录 try { foreach (string subDir in Directory.GetDirectories(path)) { queue.Enqueue(subDir); } } catch (Exception ex) {

如果我在目录列表中循环,我必须将
try{}catch{}
块放在循环之外。如果我把它放在循环中,在我抓住它之前,这个目录上可能会发生错误。不过,将try-catch放在循环中是理想的方案,因为这样可以捕获错误并继续到下一个目录

try
{
    foreach (string subDir in Directory.GetDirectories(path))
    {
        queue.Enqueue(subDir);
    }
}
catch (Exception ex)
{
   Console.Error.WriteLine(ex);
}
但由于我被迫将try-catch放在外部,它将在一个目录上出错,并且不会继续到下一个目录

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

有没有关于如何一次一个地获取每个目录的想法?

好吧,没有什么能阻止您像这样使用两个
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.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);
}
不会抛出任何异常,因此不需要try/catch块


请注意,您需要返回
return目录
是否为空后,否则输入
foreach
将抛出
空引用异常

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

if(!Directory.Exists(path) {
    //error handling here
}

foreach (string subDir in Directory.GetDirectories(path))
{
    queue.Enqueue(subDir);
}

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

如果您没有任何try-catch,那么您会遇到哪些错误?您能否进一步阐述“在我有机会捕捉到该目录之前,该目录可能会发生错误”这句话的含义?如果用户没有读取该目录的权限,
directory.Exists(path)
仍将返回true,但是
Directory.GetDirectories(path)
将引发异常。MrBlue,刚刚测试了这个,您是正确的。我读取Exists()的msdn的方式是,此场景应返回false:“如果您没有对目录的最低只读权限,Exists方法将返回false。”感谢我今天的课程!可能值得澄清:
存在
GetDirectories
需要两个不同级别的读取权限<代码>存在
需要对所检查路径的父级具有读取权限,而
GetDirectories
需要对路径本身具有读取权限。基本上,即使你看不到路径的内部,如果你对它的父级有读取权限,你仍然可以看到它是否存在。