例外が発生したときに残りのレコードをどうしたいかによって異なります。現在の実装では、最初のエラーでループが終了します。
ただし、何らかの方法でレコードを「未処理」または「エラー」としてマークし、残りのレコードを続行するだけの場合は、ループ内でエラーを完全に処理する必要があります。
foreach (var record in records)
{
try
{
Process(record);
}
catch (TypedException ex)
{
LogError(ex);
MarkAsUnprocessed(record, ex);
// respond in some other way as well?
}
}
最終的に、例外処理ロジックは、例外を処理することが論理的に意味のある場所に属します。 例外のキャッチは簡単な部分です。これは、使用されている言語の単純な構造です。例外を有意義に処理することは、まったく別の話であり、使用されている言語に依存しない論理構造です。
編集:疑似コードが例外を処理するこの方法を暗示していることも非常に注目に値します:
try
{
// something
}
catch
{
throw new Exception("something");
}
これは非常に悪い習慣です。まったく新しい例外をスローすると、本質的にキャッチされた例外が破棄され、非常に有用なデバッグ情報 (特にスタック トレース) が削除されます。すぐに例外をログに記録し、スタックを継続させたい場合は、キーワードthrow
を単独で使用します。
try
{
// something
}
catch (Exception ex)
{
// log the exception
throw;
}
例外にコンテキストを追加する場合は、再度スローする前にそのプロパティを変更できます。または、カスタム例外 (not ) をスローし、既存の例外をプロパティException
としてアタッチすることもできます。InnerException
try
{
// something
}
catch (Exception ex)
{
throw new RecordProcessingException("some additional context", ex);
}
一方、現在のコンテキストで例外を処理する意味がない場合は、それをまったくキャッチしないでください。意味のある処理ができるコードに遭遇するまで、スタックをバブルアップさせます。