2009-02-19 1 views
10

Ich brauche eine for-Schleife, die alle Iterationen vervollständigt, auch wenn es irgendeine Ausnahme in einer der Iterationen gibt.Wie behandelt man eine Ausnahme in einer Schleife und wiederhole sie?

+0

Das klingt wie eine alte Schuh gegen Glasflasche Frage: http://tinyurl.com/shoevbottle.Vielleicht möchten Sie viel mehr Details bereitstellen, um bessere Lösungen zu erhalten, einschließlich Ideen, die Sie noch nicht berücksichtigt haben. – Wedge

+0

Wedge, stimme ich zu ... wenn Sie versuchen müssen, in einer for-Schleife, wie unten, versuchen, dann etwas falsch mit der Lösung. –

+0

@Wedge: Ausgezeichnete Metapher, ein weiteres Lesezeichen für mich, danke –

Antwort

31
for (...) 
{ 
    try 
    { 
     // Do stuff 
    } 
    catch (Exception ex) 
    { 
     // Handle (or ignore) the exception 
    } 
} 
+1

Performance-Tipp, legen Sie Ihre Erklärungen außerhalb der for-Schleife. – freggel

+0

@freggel: haha, derselbe Tipp, den ich geben wollte. Aber das ist die beste Lösung. – user29964

+0

Tipp: Verwenden Sie eine stärker definierte Ausnahme, dann Exception, sagen Sie ApplicationException. Ein großes Problem mit dem Einfangen der Ausnahme ist ThreadAbortException würde hier gefangen werden, wollen Sie wirklich die Anwendung stoppen hier stoppen? Wie wäre es mit einer OutOfMemoryException? –

8

Einfach jede Iteration in einem try..catch

foreach(Person a in people) 
{ 
     try 
     { 
       WorkOnPerson(a); 
     } 
     catch 
     { 
       // do something if you want to. 
     } 
} 
-5

Es gibt keine eingebaute Funktion in einer Schleife, das zu tun. Das ist kein in C# eingebautes Sprachfeature, das automatisch eine Exception behandelt und mit einer Schleife fortfährt.

Auch soweit möglich, bitte vermeiden Sie try-catch Blöcke innerhalb der Schleife. Auch wenn es das von Ihnen erwähnte Problem löst, bedenken Sie, dass der Compiler & Laufzeit so viel zusätzlichen Job zu tun hat. Wenn es keine Ausnahmen geben würde, würde alles verschwendet werden.

Stattdessen die Ausnahmen Ausnahmen sein. Das ist etwas, das ausnahmsweise passiert: außerhalb Ihrer entworfenen Input-Überlegungen. Natürlich ist dies nur ein Vorschlag, wenn Sie wirklich die Schleife fortsetzen müssen, gehen Sie mit den beiden oben vorgeschlagenen Optionen.

+0

Keine integrierte Funktion? Was ist mit, sagen wir, CATCH? –

+1

Tun oder nicht. Es gibt keinen Versuch. , -) – Rytmis

+0

Oh Mann! Das Zeug ist offensichtlich nicht klar. Ich bearbeite es. – Sesh

0

Nun, die Sache ist ... Ihre Lösung muss eine for-Schleife und eine Art von Fehler/Ausnahmebehandlungsprozess enthalten, so dass Sie wahrscheinlich eine try catch-Anweisung in Ihre for-Schleife einbetten müssen.

Wenn eine Ausnahme ausgelöst wird, gibt es keine Möglichkeit, diese eine Iteration abzuschließen, als wenn die Ausnahme nicht ausgelöst würde. Mit einem try catch können Sie jedoch sicherstellen, dass Ihre Schleife alle Iterationen ausführt, die keine Ausnahmen auslösen.

Wenn Sie Hilfe beim Einbetten der Ausnahmebehandlung in eine for-Schleife benötigen, verwenden Sie einfach das Beispiel von teedyay!

4

Oder, wenn dies ein wiederkehrendes Muster in Ihrem Programm ist, und Sie gehen das Risiko für diese fangen alle Ausnahme-Stil, wickeln Sie es als Erweiterung für Ihre Sammlungen. Anwendung auf das vorherige Beispiel:

people.ForEachIgnorant(ofThrowingWorkOnPerson); 

Oder:

people.ForEachIgnorant(p => WorkOnPersonThatThrows(p)); 

Umsetzung:

public static void IgnorantForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    foreach (var item in source) 
    { 
     try 
     { 
      action(item); 
     } 
     catch { } 
    } 
} 
+0

Besser noch, fügen Sie ein Argument vom Typ 'Aktion 'hinzu und rufen Sie es im catch-Block auf, damit der Aufrufer bestimmen kann, wie er gehandhabt wird, und Sie keine Ausnahmen verschlingen. – Aaron

0

Ich denke, es auch ist erwähnenswert, dass, wenn Sie eine generische Liste verwenden - Sie nutzen könnten die folgende, um die Sammlung zu iterieren:

ForEach (Aktion Aktion)

http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx

EmployeesList.ForEach(ProcessEmployee); 

    void ProcessEmployee(Employee employeeItem) 
    { 
     try 
     { 
      ... 
     } 
     catch { } 
    } 

Dies hat den Vorteil, dass der Code in der Schleife wiederverwendbar zu machen.

0

Wissen Sie, was die Ausnahme ist und was wird sie verursachen? Kannst du es testen und verhindern, dass es geworfen wird, d. CanCompleteStep oder TryCompleteStep. Wenn Sie nicht fertig werden können, überspringen Sie diesen Schritt. Sie können dann die Ausnahmebehandlung aus der Schleife herausnehmen.

Verwandte Themen