Normalmente estoy de acuerdo con la mayoría de las advertencias de análisis de código, y trato de cumplirlas. Sin embargo, estoy teniendo más dificultades con este:
CA1031: no capturar tipos de excepción general
Entiendo la razón de esta regla. Pero, en la práctica, si quiero tomar la misma acción independientemente de la excepción lanzada, ¿por qué manejaría cada una específicamente? Además, si manejo excepciones específicas, ¿qué sucede si el código al que llamo cambia para lanzar una nueva excepción en el futuro? Ahora tengo que cambiar mi código para manejar esa nueva excepción. Mientras que si simplemente capturo Exception
mi código no tiene que cambiar.
Por ejemplo, si Foo llama a Bar, y Foo necesita detener el procesamiento, independientemente del tipo de excepción lanzada por Bar, ¿hay alguna ventaja en ser específico sobre el tipo de excepción que estoy captando?
Quizás un mejor ejemplo:
public void Foo()
{
// Some logic here.
LogUtility.Log("some message");
}
public static void Log()
{
try
{
// Actual logging here.
}
catch (Exception ex)
{
// Eat it. Logging failures shouldn't stop us from processing.
}
}
Si no detecta una excepción general aquí, entonces debe detectar todo tipo de excepción posible. Patrick tiene un buen punto que OutOfMemoryException
no debería tratarse de esta manera. Entonces, ¿qué pasa si quiero ignorar todas las excepciones pero OutOfMemoryException
?
OutOfMemoryError
, que está separado del Exception
árbol de herencia por esa misma razón
OutOfMemoryException
? ¿El mismo código de manejo que todo lo demás?