私は例外処理の仕方に完全に満足していることは一度もありません。多くの例外があり、try/catchはテーブルに持ち込みます(スタックの巻き戻しなど)が、プロセス内の多くのオブジェクト指向モデルを破壊するようです。C#で重複したエラー処理コードを減らす?
とにかく、ここで問題です:
のは、あなたがラップまたはネットワークファイルIO操作(例えば読み、どこか特定のUNCパスで、いくつかのファイルへの書き込み)が含まれ、いくつかのクラスがあるとしましょう。いろいろな理由から、IO操作が失敗しないようにするため、失敗したことを検出した場合は再試行し、成功するか、タイムアウトになるまで再試行を続けます。私はすでに、再試行の間に現在のスレッドをスリープさせ、タイムアウト時間が経過したかどうかを判断するためにインスタンス化して使用する便利なRetryTimerクラスを持っています。
問題は、いくつかの方法でIO操作このクラスはtry-catch/retryロジックでそれぞれをラップする必要があります。
ここでは例のコードスニペットです:
RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
try
{
// do some file IO which may succeed or fail
success = true;
}
catch (IOException e)
{
if (fileIORetryTimer.HasExceededRetryTimeout)
{
throw e;
}
fileIORetryTimer.SleepUntilNextRetry();
}
}
だから、どのようにあなたは、クラス全体ですべてのファイルIO操作のために、このコードのほとんどの重複を避けるのですか?私のソリューションは、匿名のデリゲートブロックとそれに渡されたデリゲートブロックを実行したクラス内の単一のメソッドを使用することでした。これは私が他の方法でこのようなことを行うことが許さ:
this.RetryFileIO(delegate()
{
// some code block
});
私は多少これが好き、それが望まれるためにたくさんの葉。他の人がこのような問題をどのように解決するのか聞いてみたい。
ちょうど一般的なFYI:単純に「投げる」というだけでは(ほとんどの場合、より良い)(http://philosopherdeveloper.wordpress.com/2010/05/05/re-throwing-caught-exceptions/)です –