在for循环中使用try-catch是不好的实践吗?

7

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

问题:

1. 在 for 循环内部使用 try-catch 是不好的编程实践吗?

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);
         }

    }

该消息假设失败是因为文件已打开。如果由于其他原因无法删除该文件呢? - Eric Lippert
@EricLippert - 我也是这么想的,但是我不确定该怎么做。如果由于其他原因无法删除文件,您会如何处理? - Emma Geller-Green
首先,要确定是否有人关心。如果没有人在意,不必太担心。如果有人在意,下一步就是决定如何告诉他们。控制台输出可能是一种好的方式,也可能不是。没有了解程序的其余部分很难说。接下来要做的是决定要告诉他们什么。告诉他们实话:“文件blah.txt无法删除”。考虑提供异常消息以增加更多上下文信息。但你所知道的真相是这个文件无法删除,因此从这里开始。 - Eric Lippert
我猜既然这是控制台输出,任何使用它的用户都会理解“无法删除”可能意味着他们需要关闭文件。否则可以添加建议“如果文件已打开,请关闭它”或类似内容。 - Matthew
2个回答

15

这个很有用。例如:如果你不想在抛出异常时完全停止循环,或者因异常而不应运行当前迭代的其他代码,你可以像下面这样做。

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 
     //
}

这样,您可以将错误记录下来以便稍后查看,但仍可处理您正在尝试处理的其余部分。


1
你还可以使用此catch来执行如在重启后删除文件之类的操作。https://dev59.com/ym025IYBdhLWcg3wUESP - Matthew Whited
@Mac - 非常感谢您提供的代码,以及回答我的问题。 - Emma Geller-Green
2
这里的 continue 是多余的;因为你已经到达了循环体的末尾,所以 continue 不会跳过任何内容。 - Servy
1
@Servy - 你说得对。我应该用更多的示例代码来详细说明。如果有任何与文件处理相关的额外代码,您不想运行它。相反,您希望跳到下一个文件。 - mac

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接