Encontré esta nueva característica en C # que permite que se ejecute un controlador de captura cuando se cumple una condición específica.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Estoy tratando de entender cuándo esto puede ser útil.
Un escenario podría ser algo como esto:
try
{
DatabaseUpdate()
}
catch (SQLException e)
when (driver == "MySQL")
{
//MySQL specific error handling and wrapping up the exception
}
catch (SQLException e)
when (driver == "Oracle")
{
//Oracle specific error handling and wrapping up of exception
}
..
pero esto es nuevamente algo que puedo hacer dentro del mismo controlador y delegar a diferentes métodos dependiendo del tipo de controlador. ¿Esto hace que el código sea más fácil de entender? Podría decirse que no.
Otro escenario en el que puedo pensar es algo como:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
De nuevo, esto es algo que puedo hacer como:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
¿El uso de la función 'atrapar, cuando' hace que el manejo de excepciones sea más rápido porque el controlador se omite como tal y el desenrollado de la pila puede ocurrir mucho antes en comparación con el manejo de casos de uso específicos dentro del controlador? ¿Existen casos de uso específicos que se ajusten mejor a esta función y que las personas puedan adoptar como una buena práctica?
try..catch...catch..catch..finally
?
catch (Exception ex)
, verificar el tipo y lo throw
contrario. El código un poco más organizado (también conocido como evitar el ruido del código) es exactamente la razón por la que existe esta función. (Esto es cierto para muchas funciones.)
when
necesita acceder a la excepción en sí