Encontrei esse novo recurso em C # que permite que um manipulador catch seja executado quando uma condição específica for atendida.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Estou tentando entender quando isso pode ser útil.
Um cenário poderia ser mais ou menos assim:
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
}
..
mas isso é algo que posso fazer no mesmo manipulador e delegar a métodos diferentes dependendo do tipo de driver. Isso torna o código mais fácil de entender? Provavelmente não.
Outro cenário que posso imaginar é algo como:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
Novamente, isso é algo que posso fazer como:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
Usar o recurso 'catch, when' torna o tratamento de exceções mais rápido porque o manipulador é ignorado e o desenrolamento da pilha pode acontecer muito mais cedo quando comparado ao tratamento de casos de uso específicos dentro do manipulador? Existem casos de uso específicos que se adaptam melhor a esse recurso que as pessoas podem adotar como uma boa prática?
try..catch...catch..catch..finally
?
catch (Exception ex)
, verificar o tipo e de throw
outra forma. Um código um pouco mais organizado (também conhecido como evitar o ruído do código) é exatamente por que esse recurso existe. (Isso é verdade para vários recursos.)
when
necessidade de acessar a própria exceção