In genere sono d'accordo con la maggior parte degli avvisi di analisi del codice e provo ad aderirli. Tuttavia, sto avendo un momento più difficile con questo:
CA1031: Non rilevare i tipi di eccezione generali
Capisco la logica di questa regola. Ma, in pratica, se voglio intraprendere la stessa azione indipendentemente dall'eccezione generata, perché dovrei gestirle in modo specifico? Inoltre, se gestisco eccezioni specifiche, cosa succede se il codice che sto chiamando cambia per generare una nuova eccezione in futuro? Ora devo cambiare il mio codice per gestire quella nuova eccezione. Considerando che se ho semplicemente catturato il Exception
mio codice non deve cambiare.
Ad esempio, se Foo chiama Bar e Foo deve interrompere l'elaborazione indipendentemente dal tipo di eccezione generata da Bar, c'è qualche vantaggio nell'essere specifico sul tipo di eccezione che sto rilevando?
Forse un esempio migliore:
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.
}
}
Se non si rileva un'eccezione generale qui, è necessario catturare ogni tipo di eccezione possibile. Patrick ha un buon punto che OutOfMemoryException
non dovrebbe essere affrontato in questo modo. E se volessi ignorare ogni eccezione ma OutOfMemoryException
?
OutOfMemoryError
, che è separato dall'albero Exception
dell'eredità proprio per questo motivo
OutOfMemoryException
? Stesso codice di gestione di tutto il resto?