私はこのようないくつかのコードを持っています:
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ブロックまで繰り返されます 実行されました。
...