如果我遍历目录列表,我必须将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 评论。