0

外部 Web サービスから取得したレコードのリストがあります。一部のデータはごみであり、新しい例外をスローして失敗したレコードをログに記録したいと考えています。

例外を読んでパフォーマンスに影響を与える可能性があるため、これが処理する最善の方法であるかどうか疑問に思っていますか?

Pseudo code e.g. 

try
Loop through listOfRecords
  perform logic.
catch
  throw new exception (record details)
4

2 に答える 2

1

例外が発生したときに残りのレコードをどうしたいかによって異なります。現在の実装では、最初のエラーでループが終了します。

ただし、何らかの方法でレコードを「未処理」または「エラー」としてマークし、残りのレコードを続行するだけの場合は、ループ内でエラーを完全に処理する必要があります。

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);
}

一方、現在のコンテキストで例外を処理する意味がない場合は、それをまったくキャッチしないでください。意味のある処理ができるコードに遭遇するまで、スタックをバブルアップさせます。

于 2012-07-24T02:02:28.960 に答える
0

ログ書き込み機能のみが必要なため、これは最善の方法ではありません。ログとcontinueループに書き込むだけです。

于 2012-07-24T01:49:17.687 に答える