我有一些看起来像这样的代码:

foreach(var obj in collection)
{
   try
   {
      // WriteToFile returns the name of the written file
      string filename = WriteToFile(obj);
      SendFileToExternalAPI(filename);
   }
   catch ( ArbitraryType1Exception e )
   {
      LogError(e);
      continue;
   }
   ...
   catch ( ArbitaryTypeNException e )
   {
      LogError(e);
      continue;
   }
   finally
   {
      try
      {
         File.Delete(filename);
      }
      catch (Exception e)
      {
         LogError(e);
      }
   }
}

目的是尝试为集合中的每个对象写出一个临时文件,尝试将该文件加载到需要文件名的外部API中,然后在完成后清理该临时文件。如果在将文件写到磁盘或将其加载到外部API时发生错误,我只想记录错误并继续下一个对象;我不能问用户该怎么办。

当您在catch处理程序中有continue语句时,我不确定finally块的计时如何工作。无论try块中是否引发异常,此代码是否都会(试图)删除正确的文件?还是catch语句中的continue在finally块运行之前生效?

最佳答案

可以将其视为try/finally块,其中catch表达式是可选的。代码中的两个continue语句都会将执行堆栈弹出到catch之外,这将使执行继续放置在finally块中,然后再允许循环继续进行。每当有一个try/finally块时,finally将始终被执行。

关于c# - 如果catch块包含continue语句,那么finally块何时执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11200417/

10-10 20:04