3

私の経験不足を明らかにするための質問があります。私はDoSomething()メソッドを持っています。これは、うまく処理できない場合に例外をスローします。失敗した場合は、精度の低いメソッドDoSomethingAbout()を数回試して、十分に適切な解決策が見つかることを願っています。これも失敗した場合は、最終的にDoSomethingInaccurateButGuaranteedToWork()を呼び出します。3 つすべてが、このオブジェクトに属するメソッドです。

2 つの質問: まず、この (確かに醜い) パターンは受け入れられるでしょうか、それとももっとエレガントな方法がありますか?

第二に、例外をスローする可能性があることを考えると、DoSomethingAbout()を呼び出した回数を追跡する最良の方法は何ですか? 私は現在、オブジェクトに変数 iNoOfAttempts を保持しており、try ブロックをネストしています...これは恐ろしいことであり、恥ずかしいことです。

4

4 に答える 4

4

アプリケーションの制御フローに例外を使用しないでください。

あなたの場合、3 つのメソッドを 1 つのメソッドにまとめて、どの特定のアプローチが成功したかを列挙型などで返すようにします。

于 2008-09-24T12:37:21.747 に答える
2

例外をスローする代わりに、エラー コードを返します。

これらのメソッドが失敗する方法で例外がスローされる場合は、それらすべてを同じメソッドでキャッチし、カウンターを増やしてエラー コードを返すなどの適切なアクションを実行します。

   bool result = DoSomething();
   while (!result && tries < MAX_TRIES) {
       result = DoSomethingApproximately(); //This will increment tries
       if (tries > THRESHOLD) {
           result = DoSomethingThatAlwaysWorks();
       }
   }
于 2008-09-24T12:33:09.027 に答える
2

どうですか(疑似コード):

try{ return doSomething(); }
catch(ExpectedException) { ...not much here probably...}

for(i = 0 to RETRIES){
try{ return doSomethingApproximately; }
catch(ExpectedException) { ...not much here probably...}
}

doSomethingGuaranteed();

補遺:

特別な戻り値を使用しないことを強くお勧めします。これは、関数のすべてのユーザーが、戻り値の一部が特別であることを認識しなければならないことを意味するためです。関数の範囲によっては、空のコレクションなど、正常に処理できる範囲の通常の部分を返すことが賢明な場合があります。もちろん、それでは失敗と、空のコレクション (この例では) が「正しい」答えとを区別できなくなる可能性があります。

于 2008-09-24T12:48:33.687 に答える
2

構造体ルートで関数ポインター全体に移動します。刺激を与えるために、Queue といくつかの LINQ を使用します。

Queue<Action> actions = new Queue<Action>(new Action[] {
   obj.DoSomething,
   obj.DoSomethingApproximately,
   obj.DoSomethingApproximately,
   obj.DoSomethingApproximately,
   obj.DoSomethingApproximately,
   obj.DoSomethingGuaranteed
});

actions.First(a => {
   try {
      a();
      return true;
   } catch (Exception) {
      return false;
   }
});
于 2008-09-24T13:20:54.183 に答える