Pregunta

Pensé que lanzar una excepción es una buena práctica para permitir que vuelva a la UI o en algún lugar donde registre la excepción y notifique al usuario al respecto.

¿Por qué resharper dice que es redundante?

try
{
    File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
    throw;
}
¿Fue útil?

Solución

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, la misma excepción exacta llegará a la interfaz de usuario.

En esa cláusula catch anterior, simplemente está capturando y volviendo a lanzar una excepción sin hacer nada más, como iniciar sesión, revertir una transacción, envolver la excepción para agregarle información adicional, o cualquier cosa en absoluto.

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. 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.

Otros consejos

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

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

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 algo más en el bloque de captura además de volver a lanzar la excepción.

Porque es redundante.

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

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

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

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 abundaba en una base de código que heredé hace unos proyectos y tiene el efecto desagradable de ocultar el seguimiento de la pila de la excepción original. Lanzar la excepción que acaba de atrapar de esta manera significa que la parte superior de la traza de la pila está en el nivel throw , sin mencionar DoSomething o las llamadas a métodos anidados que realmente causaron la excepción.

¡Buena suerte para depurar el código que hace esto!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top