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
需要对路径本身具有读取权限。基本上,即使你看不到路径的内部,如果你对它的父级有读取权限,你仍然可以看到它是否存在。