2009-10-24 21 views
6

私はループを一度行きたいですが、例外がスローされた場合に限りループを通って戻ります。どのようにC#でこれを書くだろうか?C#例外なくループする必要がありますか?

ありがとう

+0

を。なぜコードを投稿し、結果が欲しいのか、実際に何が起こるのか – RossFabricant

+0

私は計画がループかどうか疑問に思います。例外がある場合は、問題のオブジェクトをスキップしてループを継続しますが、これは単なる推測です。 –

答えて

1

は悪いアイデアだと思いますが、とにかくこのような何かしてみてください:

bool exceptionthrown = false; 
while (!exceptionthrown) 
{ 
    try 
    { 
    // Do magic here 
    } 
    catch (Exception) 
    { 
    exceptionthrown = true; 
    throw; 
    } 
} 
+3

例外がスローされた場合、このコードはループを経由しません。実際、追加されたコードはまったく何も得られません。 – lockstock

19

これは私に悪いデザインの匂いがします。一般的な規則は次のとおりです。フロー制御にはでなく、を使用する必要があります。これにはいくつかの理由があります。すなわち、例外が投げられる前に物事をチェックするために使用できる通常は、より良い/より信頼性の高い方法があり、効率も低下します。 - これはない推奨される方法です

再び
while (true) 
{ 
    try 
    { 
     // do stuff here 
    } 
    catch (MyException) 
    { 
     continue; 
    } 

    // all is good 
    break; 
} 

それにもかかわらず、ちょうど議論のために、次のような何かを行うことができます。

+1

私は、これが本質的に悪い設計(例えば、タイムアウト例外でフレークなネットワーク操作を再試行する)ではないが、多くはそうでない状況を考えることができます。 –

+0

多分、システムはデータベースの応答に基づいており、動作するまで待たなければなりません! –

+0

これは実際に受け入れられた回答よりもはるかに良い答えです – derekantrican

1

これは本当にあなたがやっていることとスローされている例外のタイプによって異なります。多くの例外は、まったく同じ入力/データで再試行するだけで修正されるものではなく、したがってループは例外広告を無期限に生成し続けます。

代わりに、関連する例外がないかどうかを確認し、それらの例外に対して適切な方法で処理する必要があります。

0

実際にループを実行する関数を呼び出して、その関数の後にcatchをもう一度呼び出すのはなぜでしょうか。

private void loop() { 
    for(...) { 
    } 
} 

他のいくつかの方法:

try { 
    loop(); 
} catch(Exception e) { 
    loop(); 
} 
+1

これは2回目にもう一度例外がスローされると問題になります。 – RandomGuy

0

のような何かを:

bool done = false; 
while(! done) 
{ 
    try 
    { 
    DoSomething(); 
    done = true; 
    } catch(Exception ex) 
    { 
    HandleException(ex); 
    } 
} 

Noldorinが言ったようにそれは悪いデザインのようなにおいがします。例外を使用してプログラムのフローを制御しています。操作を繰り返す条件を明示的にチェックする方がよいでしょう。

2

何が再試行回数を設定できる場所以下について:それはあなたが何を意味するか私にははっきりしていない

  int tryCount = 0; 

      while (tryCount < 3) 
      { 
       try 
       { 
        someReturn = SomeFunction(someParams); 
       } 
       catch (Exception) 
       { 
        tryCount++; 
        continue; 
       } 
       break; 
      }