una todas que propagacion pantalla manejo las hacer excepciones ejemplos crear como celular captura exception-handling try-catch resharper rethrow

exception handling - todas - ¿Por qué resharper dice "cláusula de captura con una sola declaración de ''lanzar'' es redundante ''?



screenshot (6)

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

Te advierte porque no tiene sentido tener ese intento ... atrapar el bloque allí.

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

Pensé que lanzar una excepción es una buena práctica para dejar que vuelva a la UI o en algún lugar donde se registra la excepción y se lo notifica al usuario.

¿Por qué Resharper dice que es redundante?

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


Porque

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

no es diferente de

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

Si la llamada a File.Open(string, FileMode) falla, entonces en cualquiera de las muestras, exactamente la misma excepción encontrará su camino hasta la interfaz de usuario.

En la cláusula de catch anterior, simplemente está capturando y volviendo a lanzar una excepción sin hacer nada más, como registrar, revertir una transacción, envolver 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 redundancias y ReSharper no debería quejarse. Igualmente,

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.


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

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


Porque es redundante.


Porque la declaración anterior tiene el mismo comportamiento que si no estuviera allí. Igual que escribir:

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


Vale la pena señalar que mientras ...

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

... es redundante, lo siguiente no es ...

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

Este segundo fragmento de código abundó en un código base que heredé hace unos pocos proyectos y tiene el desagradable efecto de ocultar el rastro de pila de la excepción original. Lanzar la excepción que acaba de capturar de esta manera significa que la parte superior del seguimiento de la pila está en el nivel de throw , sin mencionar DoSomething o cualquier método anidado que haya llamado a la causa.

¡Buena suerte con el código de depuración que hace esto!