2009-06-19 11 views

Respuesta

53

Debido

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch { 
    throw; 
} 

no es diferente a

File.Open("FileNotFound.txt", FileMode.Open); 

Si la llamada a File.Open(string, FileMode) falla, ya sea en la muestra exactamente la misma excepción encontrarán su camino hasta a la IU.

En la cláusula anterior catch, simplemente está capturando y volviendo a lanzar una excepción sin hacer nada más, como el registro, la anulación de una transacción, el ajuste de la excepción para agregar información adicional o cualquier otra cosa.

Sin embargo,

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch(Exception ex) { 
    GetLogger().LogException(ex); 
    throw; 
} 

no contendría ningún despido y ReSharper no debería quejarse. Del mismo modo,

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch(Exception ex) { 
    throw new MyApplicationException(
     "I'm sorry, but your preferences file could not be found.", ex); 
} 

no sería redundante.

+2

Tener un catch-and-rethrow no es lo mismo que no tener catch. Los filtros de excepción para cada bloque catch entre un sitio throw y la primera captura exitosa se ejecutarán antes de que se ejecute cualquier bloque 'finally'; un catch-and-rethrow hará que todos los bloques 'finally' dentro de él se ejecuten antes de que se ejecuten los filtros de excepción fuera de él. Por cierto, ¿está satisfecho el reafilar si seguir un catch-and-rethrow es otro bloque catch más general que hace algo (por lo que el catch-and-rethrow serviría para eludir el último bloque de catch)? – supercat

17

Debido a la afirmación anterior tiene el mismo comportamiento que si no estuviera allí. Igual que la escritura:

File.Open("FileNotFound.txt", FileMode.Open); 
+0

Entonces, ¿es mejor escribir esa línea de código sin intentarlo? – orandov

+8

Sí. No capte lo que no va a manejar. –

+0

@orandov - no necesariamente. Por ejemplo, puede capturar una IOException y arrojar una excepción más significativa (desde la perspectiva del usuario) derivada de ApplicationException. –

4

Porque el código en el intento ya está arrojando la excepción.

Solo querrá atrapar y volver a lanzar la excepción si va a hacer algo más en el bloque catch además de volver a lanzar la excepción.

1

No ha realizado ningún procesamiento en el bloque catch, solo arrojó la excepción nuevamente.

Te advierte porque no tiene sentido que intentes ... atrapar bloques allí.

Además, otro buen consejo es que "throw ex" no conservará el seguimiento de la pila, pero "throw" lo hará.

4

Porque es redundante.

+9

Porque es redundante. –

+0

¿Desde cuándo se establece la pregunta como respuesta una respuesta real :)? – orandov

+7

"Cuando es redundante". –

1

Vale la pena señalar que, si bien ...

try 
{ 
    DoSomething(); 
} 
catch 
{ 
    throw; 
} 

... es reduntant, los siguientes no es ...

try 
{ 
    DoSomething(); 
} 
catch (Exception ex) 
{ 
    // Generally a very bad idea! 
    throw ex; 
} 

Este segundo fragmento de código era común a través de una base de código que heredé Hace unos pocos proyectos y tiene el desagradable efecto de ocultar el seguimiento de la pila de la excepción original. Lanzar la excepción que acaba de capturar de esta forma significa que la parte superior del seguimiento de la pila está en el nivel throw, sin mencionar DoSomething o lo que sea que las llamadas de método anidado causaron la excepción.

Buena suerte depurando código que hace esto!

+1

R # se puede configurar para advertir que este último es "probablemente no intencionado". – AakashM

Cuestiones relacionadas