2010-02-08 7 views
5

¿Hay alguna forma de hacer que un iterador creado por rendimiento continúe con el siguiente elemento cuando se produce una excepción dentro de uno de los bloques del iterador?¿Hay alguna manera de hacer un rendimiento creado Iterador Continuar con el siguiente elemento después de una excepción?

Esto no está actualmente trabajando:

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

Respuesta

3

n no lo hay. El código generado para un iterador C# no admite excepciones lanzadas. Si se lanza una excepción, la operación MoveNext no se completará y la siguiente llamada se reproducirá desde el mismo lugar desde el punto de vista del código del iterador generado.

+0

No del todo, una excepción lanzada por el empadronador se puso en la "enumeración completa" estado. –

+0

¿Entonces no hay forma de avanzar un paso? Debería haber. – aattia

+0

@aattia, el método MoveNext es la manera de avanzar un paso. El otro código evita que esto suceda al lanzar una excepción. Un enumerador que arroja una excepción está fundamentalmente roto ya que no es utilizable por el 99% de los usos de IEnumerable. Tiene poco valor agregar un método que dice "si el iterador ya está roto, por favor pise de todos modos". – JaredPar

Cuestiones relacionadas