2010-06-10 25 views
6
foreach (Widget item in items) 
{ 
try 
{ 
    //do something... 
} 
catch { } 
} 


foreach (Widget item in items) 
{ 
try 
{ 
    //do something... 
} 
catch { continue; } 
} 

Respuesta

8

En ese caso, nada, ya que la prueba es la última declaración de la instrucción compuesta de bucle. continue siempre irá a la siguiente iteración o finalizará el ciclo si la condición ya no se cumple.

20

catch { continue; } hará que el código comience en una nueva iteración, salteando cualquier código después del bloque catch dentro del ciclo.

3

El compilador lo ignorará. Esto fue tomado de Reflector.

public static void Main(string[] arguments) 
{ 
    foreach (int item in new int[] { 1, 2, 3 }) 
    { 
     try 
     { 
     } 
     catch 
     { 
     } 
    } 
    foreach (int item in new int[] { 1, 2, 3 }) 
    { 
     try 
     { 
     } 
     catch 
     { 
     } 
    } 
} 
+2

Esto es probablemente una optimización realizada por el compilador. es muy específico para el código de ejemplo anterior. si hubo declaraciones después del bloque catch (en el segundo bucle foreach), entonces probablemente deberías ver un continuar. Entonces no puedes decir, continuar es ignorado siempre. – SysAdmin

+0

@SysAdmin - Tengo curiosidad por saber por qué hiciste este comentario cuando en ninguna parte de mi respuesta menciono que 'continue' siempre será ignorado. – ChaosPandion

9

Las otras respuestas indican qué sucederá en el fragmento dado. Con su cláusula de captura como el código final en el ciclo, no hay diferencia funcional. Si tenía un código que seguía la cláusula de captura, entonces la versión sin "continuar" ejecutaría ese código. continue es el hermanastro de break, cortocircuita el resto del cuerpo del bucle. Con continue, se salta a la siguiente iteración, mientras que break sale por completo del ciclo. De todos modos, demuestra tus dos comportamientos por ti mismo.

for (int i = 0; i < 10; i++) 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    catch 
    { 
    } 

    Console.WriteLine("I'm after the exception"); 
} 

for (int i = 0; i < 10; i++) 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    catch 
    { 
     continue; 
    } 

    Console.WriteLine("this code here is never called"); 
} 
0

Si su muestra es seguida textualmente, entonces, yo diría que "no hay diferencia"!

Pero, si tiene sentencias que se ejecutarán después de su captura, ¡entonces es un juego completamente diferente!
catch { continue; } saltará cualquier cosa después del bloque catch !!!
catch{} seguirá ejecutando las instrucciones después del bloque catch !!

Cuestiones relacionadas