2010-02-08 9 views
5

Gibt es eine Möglichkeit, einen Ertrag erstellt Iterator mit dem nächsten Element fortsetzen, wenn eine Ausnahme in einem der Iterator-Blöcke auftritt?Gibt es eine Möglichkeit, einen Ertrag erstellt Iterator Weiter zum nächsten Element bei einer Ausnahme?

Dies ist derzeit nicht funktioniert:

 Boolean result; 
     while (true) 
     { 
      try 
      { 
       result = enumerator.MoveNext(); //Taken from a yield created enumerable 
       if (!result) break; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("CATCHED..."); 
       continue; 
      } 
     } 

Antwort

3

Nein ist es nicht. Der generierte Code für einen C# -Iterator unterstützt keine ausgelösten Ausnahmen. Wenn eine Ausnahme ausgelöst wird, wird die MoveNext-Operation nicht abgeschlossen, und der nächste Aufruf wird vom gleichen Ort aus vom Standpunkt des generierten Iteratorcodes wiedergegeben.

+0

Nicht ganz, eine Ausnahme von der enumerator geworfen wird es in der "Enumeration abgeschlossen" setzen Zustand. –

+0

Es gibt also keine Möglichkeit, einen Schritt weiter zu machen? Es sollte sein. – aattia

+0

@aattia, ist die MoveNext-Methode der Weg, um einen Schritt voranzukommen. Der andere Code verhindert dies, indem er eine Ausnahme auslöst. Ein Enumerator, der eine Ausnahme auslöst, ist grundlegend fehlerhaft, da er von 99% der IEnumerable-Verwendungen nicht verwendet werden kann. Es gibt wenig Wert beim Hinzufügen einer Methode, die sagt "Wenn der Iterator bereits gebrochen ist, bitte Schritt trotzdem". – JaredPar