C# 在For循环中放一个Try-Catch是不好的做法吗?

C# 在For循环中放一个Try-Catch是不好的做法吗?,c#,for-loop,try-catch,C#,For Loop,Try Catch,我正在创建一个命令行实用程序,它将删除子目录/文件。如果文件正在使用中,将抛出System.IO.IOException。我在for循环中使用try-catch块 问题: 1.在for循环中尝试捕捉是否不好 2.如果是,有什么更好的选择 我的代码: System.IO.DirectoryInfo di = new DirectoryInfo(path); foreach (FileInfo file in di.GetFiles()) { try

我正在创建一个命令行实用程序,它将删除子目录/文件。如果文件正在使用中,将抛出
System.IO.IOException
。我在for循环中使用try-catch块

问题:

1.在for循环中尝试捕捉是否不好

2.如果是,有什么更好的选择

我的代码:

  System.IO.DirectoryInfo di = new DirectoryInfo(path);

    foreach (FileInfo file in di.GetFiles())
    {
         try
         {
             file.Delete(); 
         }
         catch(System.IO.IOException)
         {
           Console.WriteLine("Please Close the following File {0}", file.Name);
         }

    }

不,这可能非常有用。例如:如果您不想在抛出异常时完全停止循环,或者如果由于该异常,当前迭代中不应该运行额外的代码,那么您可以执行以下操作

System.IO.DirectoryInfo di = new DirectoryInfo(path);

foreach (FileInfo file in di.GetFiles())
{
     try
     {
         file.Delete(); 
     }
     catch(System.IO.IOException)
     {
       Console.WriteLine("Please Close the following File {0}", file.Name);
       continue;
     }
     //
     // Other Code 
     //
}

通过这种方式,您可以记录错误以供以后查看,但仍然可以处理您试图处理的其余内容。

不,故意跳过异常不是一种坏做法。 但是看看你的用例

我正在创建一个命令行实用程序,它将删除子目录/文件。如果文件正在使用中,将引发System.IO.IOException

我建议您删除该目录,而不是在子文件夹中的每个文件上循环。

您还可以使用此catch执行类似于在重新启动时删除文件的操作@Mac-非常感谢代码和回答我的问题。这里的
continue
是多余的;您已经在循环体的末尾,因此
continue
不会跳过任何内容。@Servy-您是对的。我应该用更多的示例代码进行详细说明。如果有任何与文件处理相关的额外代码,则不希望运行它。相反,您希望跳到下一个文件。该消息假定失败是因为文件已打开。如果文件由于其他原因无法删除怎么办?@EricLippert-我正是这么想的,但是,我不确定如何继续。如果文件因其他原因无法删除,您将如何处理?首先,确定是否有人关心。如果没有人关心,不要为此而紧张。如果有人在乎,下一步要做的就是决定如何告诉他们。控制台输出也许是一种好方法,也许不是。很难说不了解节目的其余部分。下一步要做的是决定告诉他们什么。告诉他们真相:“blah.txt文件无法删除”。考虑从异常中添加消息以添加更多上下文。但你知道的事实是,文件无法删除,所以从这个开始。我猜,因为它是控制台输出,任何使用它的用户都会理解“无法删除”可能意味着他们需要关闭文件。否则可以添加建议“如果文件已打开,请将其关闭”或其他内容。