5

私はこのように見えるいくつかのコードを持っています:

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ブロックが実行される前に有効になりますか?

4

4 に答える 4

16

オプションのcatch式を使用したtry/finallyブロックと考えてください。コード内の両方のcontinueステートメントは、実行スタックをキャッチからポップし、ループを続行させる前に、finallyブロックに実行を配置します。try / finallyブロックがあるときはいつでも、finallyが常に実行されます。

于 2012-06-26T03:41:30.890 に答える
8

例外がスローされたかどうかに関係なく、finallyブロックが実行されます。したがって、finallyブロックは常に実行されます。

于 2012-06-26T03:33:34.560 に答える
6

は、終了finallyする前の最後のステップとして実行されtryます。したがって、適切なタイミングで発生します。概念化を容易にするために、すべてのcontinueステートメントがに置き換えられた場合に何が起こるかを考えてくださいreturn-finallyそれでも実行されます。

于 2012-06-26T03:37:28.057 に答える
6

C#言語仕様から:

8.9.2続行ステートメント

..。

continueステートメントはfinallyブロックを終了できません(§8.10)。継続ステートメントがfinallyブロック内で発生する場合、continueステートメントのターゲットは同じfinallyブロック内にある必要があります。そうしないと、コンパイル時エラーが発生します。

継続ステートメントは次のように実行されます。

・continueステートメントが関連するfinallyブロックを持つ1つ以上のtryブロックを終了する場合、制御は最初に最も内側のtryステートメントのfinallyブロックに移されます。コントロールがfinallyブロックのエンドポイントに到達すると、コントロールは次の囲んでいるtryステートメントのfinallyブロックに転送されます。このプロセスは、間にあるすべてのtryステートメントのfinallyブロックが実行されるまで繰り返されます。

..。

于 2012-06-26T03:41:26.477 に答える