2009-10-24 4 views
6

Ich möchte einmal durch eine Schleife gehen, aber nur wenn eine Ausnahme ausgelöst wird, gehen Sie durch die Schleife zurück. Wie würde ich das in C# schreiben?C# Sollte ich Schleife bis keine Ausnahme?

Danke

+0

Es ist mir nicht klar, was Sie meinen. Warum postest du nicht etwas Code, sagst, was das Ergebnis sein soll und was tatsächlich passiert. – RossFabricant

+0

Ich frage mich, ob der Plan eine Schleife ist, und wenn es eine Ausnahme gibt, überspringe das Problemobjekt und fahre mit der Schleife fort, aber das ist nur eine Vermutung. –

Antwort

1

scheint wie eine schlechte Idee, aber trotzdem so etwas wie dies versuchen:

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

Dieser Code wird nicht durch die Schleife zurückgehen, wenn eine Ausnahme ausgelöst wird. Tatsächlich bringt der hinzugefügte Code genau nichts. – lockstock

19

Das riecht nach schlechtem Design für mich. Die allgemeine Regel lautet: Ausnahmen sollten nicht für die Flusskontrolle verwendet werden. Dafür gibt es eine Reihe von Gründen. es gibt nämlich normalerweise bessere/zuverlässigere Methoden, die verwendet werden können, um Dinge zu überprüfen, bevor eine Ausnahme ausgelöst wird, und auch die Effizienz sinkt.

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

    // all is good 
    break; 
} 

wieder - das ist nicht die empfohlene Methode:

Dennoch, nur für die Zwecke der Beweisführung, könnten Sie so etwas wie die folgenden tun. Ich würde gerne etwas Besseres empfehlen, wenn Sie ein bisschen mehr Kontext/Beispiele/

+1

Ich kann an einige Umstände denken, bei denen dies nicht von Natur aus schlechtes Design ist (z. B. Wiederholen einer flockigen Netzwerkoperation bei einer Timeout-Ausnahme), aber nicht viele. –

+0

Vielleicht basiert das System auf der Antwort der Datenbank und Sie müssen darauf warten, bis es funktioniert! –

+0

Dies ist eine viel bessere Antwort als die tatsächlich angenommene Antwort – derekantrican

1

dass hängt wirklich davon ab bieten könnte, was Sie tun, und die Art der Ausnahme geworfen. Viele Ausnahmen sind nicht etwas, was behoben werden würde, indem man es mit genau den gleichen Eingaben/Daten erneut versucht, und somit würde das Schleifen die Ausnahme ad infinitum erzeugen.

Stattdessen sollten Sie für relevante Ausnahmen überprüfen und sie dann für diese bestimmten Ausnahmen in angemessener Weise behandeln.

0

Warum eine Funktion nicht aufrufen, die tatsächlich die Schleife der Fall ist, und haben einen Haken, nachdem es, die die Funktion wieder anrufen würde.

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

eine andere Methode:

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

Dies ist problematisch, wenn die Ausnahme beim zweiten Mal erneut ausgelöst wird. – RandomGuy

0

Etwas wie:

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

Wie Noldorin sagte Es riecht nach einem schlechten Design. Sie verwenden Ausnahmen, um den Programmablauf zu steuern. Es ist besser, explizite Überprüfungen für die Bedingungen zu haben, die dazu führen, dass Sie die Operation wiederholen.

2

Was ist mit den folgenden, wo Sie eine Wiederholungsanzahl festlegen:

  int tryCount = 0; 

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