2009-02-19 20 views
10

Necesito un bucle for que completará todas sus iteraciones, incluso si hay alguna excepción en cualquiera de las iteraciones.¿Cómo maneja una excepción en un bucle y sigue iterando?

+0

Esto suena como un zapato viejo vs. pregunta de vidrio de botella: http://tinyurl.com/shoevbottle.Es posible que desee proporcionar muchos más detalles para obtener mejores soluciones, incluidas las ideas que aún no ha considerado. – Wedge

+0

Wedge, estoy de acuerdo ... si debe poner try/catch dentro de un ciclo for, como a continuación, entonces algo puede estar mal con la solución. –

+0

@Wedge: Excelente metáfora, otro marcador para mí, gracias –

Respuesta

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

Consejo de rendimiento, coloque sus declaraciones fuera del ciclo for. – freggel

+0

@freggel: jaja, el mismo consejo que quería dar. Pero esta es la mejor solución. – user29964

+0

Consejo: utilice una Excepción más estrictamente definida, luego Excepción, llame ApplicationException. un gran problema con la captura de excepción es que ThreadAbortException se capturará aquí, ¿realmente desea detener la aplicación para que no se detenga aquí? ¿Qué tal capturar una OutOfMemoryException? –

8

sólo hay que poner cada iteración dentro de un try..catch

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

No hay ninguna característica intrínseca en un bucle de hacer eso. Esa no es una función de idioma integrada en C# que manejará automáticamente una excepción y continuará con un ciclo.

también a la medida de lo posible, evite poner bloques try-catch dentro del bucle. Aunque resuelve el problema que menciona, considere que el compilador & de tiempo de ejecución tiene que hacer tanto trabajo adicional. Si no hubiera excepciones, todo eso sería inútil.

En su lugar, las excepciones son excepciones. Eso es algo que ocurre excepcionalmente: fuera de las consideraciones de entrada diseñadas. Por supuesto, esto es solo una sugerencia, si realmente tiene que continuar el ciclo, vaya con las dos opciones sugeridas anteriormente.

+0

¿No hay característica incorporada? ¿Qué tal, por ejemplo, CATCH? –

+1

Hacer o no. Aquí no hay intentos. , -) – Rytmis

+0

¡Oh hombre! las cosas obviamente no están claras. Lo estoy editando. – Sesh

0

Bueno, la cosa es ... Su solución tendrá que incluir un bucle for y algún tipo de proceso de manejo de error/excepción, por lo que probablemente tenga que incrustar una declaración try catch en su bucle for.

Si se produce una excepción, no hay forma de que se completa una iteración que como lo haría si la excepción no fue lanzado. Sin embargo, al utilizar un try catch puede asegurarse de que su bucle ejecute todas las iteraciones que no arrojen excepciones.

Si usted necesita ayuda con la incorporación de la gestión de excepciones en un bucle, sólo tiene que utilizar el ejemplo publicado por teedyay!

4

O, si este es un patrón recurrente en su programa, y se está arriesgando con este estilo de excepción, envuélvalo como una extensión de sus colecciones. Su aplicación en el ejemplo anterior:

people.ForEachIgnorant(ofThrowingWorkOnPerson); 

O:

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

Implementación:

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

Mejor aún, agregue un argumento de tipo 'Acción ' e inícielo en el bloque catch. De esta forma la persona que llama puede determinar cómo se maneja y no está tragando excepciones. – Aaron

0

Creo que es también digno de mención que si está utilizando una lista genérica - se puede utilizar el siguiente para iterar la colección:

ForEach (acción acción)

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

EmployeesList.ForEach(ProcessEmployee); 

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

Esto tiene la ventaja de hacer el código reutilizable en su bucle.

0

¿Conoce lo que es la excepción y lo que hará que? ¿Puedes probarlo y evitar que sea lanzado, es decir. CanCompleteStep o TryCompleteStep. si no puedes completar simplemente salta ese paso. A continuación, puede poner el manejo de excepciones fuera del ciclo.

Cuestiones relacionadas