Mi sono imbattuto in questa nuova funzionalità in C # che consente l'esecuzione di un gestore di catch quando viene soddisfatta una condizione specifica.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Sto cercando di capire quando questo potrà mai essere utile.
Uno scenario potrebbe essere qualcosa del genere:
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
}
..
ma anche questo è qualcosa che posso fare all'interno dello stesso gestore e delegare a metodi diversi a seconda del tipo di driver. Questo rende il codice più facile da capire? Probabilmente no.
Un altro scenario a cui posso pensare è qualcosa del tipo:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
Ancora una volta questo è qualcosa che posso fare come:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
L'uso della funzione "prendi, quando" rende la gestione delle eccezioni più veloce perché il gestore viene saltato come tale e lo svolgimento dello stack può avvenire molto prima rispetto alla gestione dei casi d'uso specifici all'interno del gestore? Esistono casi d'uso specifici che si adattano meglio a questa funzione che le persone possono quindi adottare come buona pratica?
try..catch...catch..catch..finally?
catch (Exception ex), controllare il tipo e throwaltro. Il codice leggermente più organizzato (ovvero evitare il rumore del codice) è esattamente il motivo per cui esiste questa funzionalità. (Questo in realtà è vero per molte funzionalità.)
whennecessità di accedere all'eccezione stessa