错误处理干扰了 C# 中的递归方法
Error handling is interfering with the Recursive method in C#
我正在创建一个目录中的文件列表。在列出该列表之前,我首先要进行错误检查以确保在控制台应用程序中输入的目录有效。我正在使用递归创建一个循环,这样如果目录无效,它将 运行 通过验证方法返回。
从我的 Program.cs class 我开始使用 GetFileListFromDirectory 方法。然后该方法转到 IsValidDirectory 方法。如果我第一次输入一个好的目录路径,一切正常。当我通过 IsValidDirectory 方法正确输入 运行s 并使用错误目录进行测试时,出现错误;所以我在控制台中输入一个新目录,该方法循环回到 IsValidDirectory 的开头(就像它应该的那样)并验证新目录是否正确但是当它到达 return 时它会跳回到 Catch 行带有原始错误目录的 IsValidDirectory。执行此操作后,它然后 returns 到 GetFileListFromDirectory 并卡在 while 循环中,因为 isValid 仍然是 false,而此时它实际上应该是 true。
感谢您的帮助!
/* Creates a list of all of the files in the chosen directory for mass audit potential */
public List<string> GetFileListFromDirectory(string inputDirectory)
{
bool isValid = false; //makes sure the directory is validated before continuing the method
while (!isValid)
{
isValid = IsValidDirectory(inputDirectory);
}
DirectoryInfo directory = new DirectoryInfo(inputDirectory);
FileInfo[] folder = directory.GetFiles("*");
List<string> files = new List<string>();
if (isValid)
{
foreach (var file in folder)
{
files.Add(file.Name.ToString().Replace(".csv", "").Replace(".txt", ""));
}
return files;
}
return null; //code path does not allow this return
}
/* Method keeps looping back to GetFileListFromDirectory if the directory results in error */
public bool IsValidDirectory(string inputDirectory)
{
bool validDirectory;
try
{
DirectoryInfo directory = new DirectoryInfo($@"{inputDirectory}");
FileInfo[] folder = directory.GetFiles("*");
validDirectory = true;
}
catch(Exception e)
{
Console.WriteLine($"\n{e}\n\nCheck the directory path and enter it again: ");
IsValidDirectory(Console.ReadLine());
validDirectory = false;
}
return validDirectory;
}
而不是递归调用 IsValidDirectory
,您需要将调用向上移动到调用方法。尝试将 while
块更改为:
while (true)
{
if (IsValidDirectory(inputDirectory))
{
break;
}
Console.WriteLine($"\n\nCheck the directory path and enter it again: ");
inputDirectory = Console.ReadLine();
}
并删除 catch
块的前两行,只留下:
catch (Exception e)
{
validDirectory = false;
}
我知道你在哪里被绊倒了。问题是输入目录不是通过引用传递的。退出该循环的唯一方法是在 GetFileListFromDirectory 方法中更改 inputdirectory 值。实现此目的的简单方法是在循环设置 inputDirectory 值时将控制台 readline 移动到您内部。
例如(请务必从 isvalid 方法中删除 readline:
while(!isValid)
{
isValid = IsValidDirectory(inputDirectory);
if(!isValid)
{
inputDirectory = Console.ReadLine();
}
}
我正在创建一个目录中的文件列表。在列出该列表之前,我首先要进行错误检查以确保在控制台应用程序中输入的目录有效。我正在使用递归创建一个循环,这样如果目录无效,它将 运行 通过验证方法返回。
从我的 Program.cs class 我开始使用 GetFileListFromDirectory 方法。然后该方法转到 IsValidDirectory 方法。如果我第一次输入一个好的目录路径,一切正常。当我通过 IsValidDirectory 方法正确输入 运行s 并使用错误目录进行测试时,出现错误;所以我在控制台中输入一个新目录,该方法循环回到 IsValidDirectory 的开头(就像它应该的那样)并验证新目录是否正确但是当它到达 return 时它会跳回到 Catch 行带有原始错误目录的 IsValidDirectory。执行此操作后,它然后 returns 到 GetFileListFromDirectory 并卡在 while 循环中,因为 isValid 仍然是 false,而此时它实际上应该是 true。
感谢您的帮助!
/* Creates a list of all of the files in the chosen directory for mass audit potential */
public List<string> GetFileListFromDirectory(string inputDirectory)
{
bool isValid = false; //makes sure the directory is validated before continuing the method
while (!isValid)
{
isValid = IsValidDirectory(inputDirectory);
}
DirectoryInfo directory = new DirectoryInfo(inputDirectory);
FileInfo[] folder = directory.GetFiles("*");
List<string> files = new List<string>();
if (isValid)
{
foreach (var file in folder)
{
files.Add(file.Name.ToString().Replace(".csv", "").Replace(".txt", ""));
}
return files;
}
return null; //code path does not allow this return
}
/* Method keeps looping back to GetFileListFromDirectory if the directory results in error */
public bool IsValidDirectory(string inputDirectory)
{
bool validDirectory;
try
{
DirectoryInfo directory = new DirectoryInfo($@"{inputDirectory}");
FileInfo[] folder = directory.GetFiles("*");
validDirectory = true;
}
catch(Exception e)
{
Console.WriteLine($"\n{e}\n\nCheck the directory path and enter it again: ");
IsValidDirectory(Console.ReadLine());
validDirectory = false;
}
return validDirectory;
}
而不是递归调用 IsValidDirectory
,您需要将调用向上移动到调用方法。尝试将 while
块更改为:
while (true)
{
if (IsValidDirectory(inputDirectory))
{
break;
}
Console.WriteLine($"\n\nCheck the directory path and enter it again: ");
inputDirectory = Console.ReadLine();
}
并删除 catch
块的前两行,只留下:
catch (Exception e)
{
validDirectory = false;
}
我知道你在哪里被绊倒了。问题是输入目录不是通过引用传递的。退出该循环的唯一方法是在 GetFileListFromDirectory 方法中更改 inputdirectory 值。实现此目的的简单方法是在循环设置 inputDirectory 值时将控制台 readline 移动到您内部。
例如(请务必从 isvalid 方法中删除 readline:
while(!isValid)
{
isValid = IsValidDirectory(inputDirectory);
if(!isValid)
{
inputDirectory = Console.ReadLine();
}
}