私は、DBとネットワークの操作のためにリトリーを処理しなければならない場合、複数のケースがあります。どこでも私はそれ、私は次のコードの種類を持っているかの操作を行います。Java:コピー・ペースト・コードなしで再試行する方法は?
for (int iteration = 1; ; iteration++) {
try {
data = doSomethingUseful(data);
break;
} catch (SomeException | AndAnotherException e) {
if (iteration == helper.getNumberOfRetries()) {
throw e;
} else {
errorReporter.reportError("Got following error for data = {}. Continue trying after delay...", data, e);
utilities.defaultDelayForIteration(iteration);
handleSpecificCase(data);
}
}
}
問題は、このコードパターンは、コピー&ペースト、すべての私のクラスの上にあるということです。それは本当に悪いです。私は通常、処理するために別の例外が発生するため、このfor-break-catchコピー・ペースト・パターンを取り除く方法を理解できません。失敗したデータをログに記録したい(通常は別の方法もあります)。
Java 7でこのコピー貼り付けを避ける良い方法はありますか?
編集:私は依存性注入にguiceを使用します。私は例外をチェックしています。 1つのデータではなく複数の変数があり、それらはすべて異なるタイプです。
Edit2:AOPのアプローチは、私にとって最も有望なものです。アプローチを拡張interface.run(data)
DBアクセスコードがすべての場合、なぜ例外が異なるのはなぜですか?あなたはいくつかの例を挙げることができますか? – DNA
私はちょうど質問を編集しましたが、論理的にはDBとネットワーキングがあり、操作によってはDBだけでも異なる例外で失敗します。また、doSomethingUseful()は、私が同じように扱いたいと思う例外をスローするかもしれません。 – Artem
の例外はチェックされているかチェックされていませんか? – meriton