/ / catchブロックにcontinueステートメントが含まれている場合、finallyブロックはいつ実行されますか? -c#、try-catch-finally、フロー制御

catchブロックにcontinue文が含まれていると、finallyブロックはいつ実行されますか? - c#、try-catch-finally、フロー制御

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

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にロードするときにエラーが発生した場合は、エラーをログに記録して次のオブジェクトに移動します。ユーザーに何をすべきか尋ねることはできません。

キャッチハンドラーにcontinueステートメントがある場合、finallyブロックのタイミングがどのように機能するかについては、少し不確かです。このコードは、削除しようとします(試みます) 正しいファイル tryブロックで例外がスローされたかどうかに関係なく?または、catchステートメントのcontinueは、finallyブロックが実行される前に有効になりますか?

回答:

回答№1の11

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


回答№2のための8

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


回答№3の6

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


回答№4の6

から C#言語仕様

8.9.2 continueステートメント

...

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

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

・continueステートメントが1つまたはもっとブロックを試す 最終的に関連付けられたブロック、制御は最初に 最後に、最も内側のtryステートメントのブロック。いつ制御するか finallyブロックの終了点に到達すると、制御が 次の囲んでいるtryステートメントの最終ブロック。このプロセスは 間にあるすべてのtryステートメントのfinallyブロックまで繰り返されます 実行されました。

...