Esta pregunta proviene de un análisis de código ejecutado contra un objeto que he creado. El análisis dice que debería detectar un tipo de excepción más específico que solo la Excepción básica.Captura de excepciones específicas frente a genéricas en C#
¿Se encuentra usando solo la excepción genérica o intentando atrapar una excepción específica y una excepción por defecto usando múltiples bloques catch?
Uno de los trozos de código en cuestión es el siguiente:
internal static bool ClearFlags(string connectionString, Guid ID)
{
bool returnValue = false;
SqlConnection dbEngine = new SqlConnection(connectionString);
SqlCommand dbCmd = new SqlCommand("ClearFlags", dbEngine);
SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCmd);
dbCmd.CommandType = CommandType.StoredProcedure;
try
{
dbCmd.Parameters.AddWithValue("@ID", ID.ToString());
dbEngine.Open();
dbCmd.ExecuteNonQuery();
dbEngine.Close();
returnValue = true;
}
catch (Exception ex)
{ ErrorHandler(ex); }
return returnValue;
}
Gracias por su consejo
EDIT: Aquí es la advertencia del análisis de código
Advertencia 351 CA1031: Microsoft.Design: modifique 'ClearFlags (cadena, Guid)' para detectar una excepción más específica que 'Exception' o vuelva a lanzar la excepción
@Simon: ¡Gracias! Aprecio la respuesta! ¿Puedes darme un poco más sobre por qué no debes atrapar y tragar una Excepción de nivel superior? La forma en que tengo mi código ahora, el método "ErrorHandler" reúne tanta información como puede de la excepción y la esconde en el registro de eventos (seguimiento de pila, excepción interna, mensaje, etc.). No estoy seguro de las consecuencias de capturar/procesar la excepción desde su punto de vista. –
¿Cuál sería el objetivo de detectar una excepción, iniciar sesión y luego volver a lanzarla? –
@Kyralessa: Baje la pila de códigos en el DAL. Puede que las cosas vayan mal y quiera iniciar sesión. Por lo tanto, puede capturar y registrar una Excepción de nivel superior, pero no debe tragarla porque realmente no sabe lo que salió mal (y te arriesgas a tragar algo serio como OutOfMemEx). Por lo tanto, debes volver a lanzarlo. Si quisieras manejarlo, deberías tomar el tipo de excepción específica que sabes cómo manejar. Si todo lo que puede recurrir es atrapar "Excepción", entonces debe volver a lanzar (o ajustar y volver a lanzar) para permitir que una persona que llama más arriba lo maneje apropiadamente. @Scott: He expandido mi respuesta un poco. –