In genere sono d'accordo con la maggior parte degli avvisi di analisi del codice, e cerco di aderire a loro. Tuttavia, sto passando un momento difficile con questo:
CA1031: Do not catch general exception types
Capisco la logica di questa regola. Ma, in pratica, se voglio prendere la stessa azione indipendentemente dall'eccezione lanciata, perché dovrei gestirli singolarmente? 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 questa nuova eccezione. Considerando che se ho catturato semplicemente Exception
il 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 trovi un'eccezione generale qui, devi cogliere ogni tipo di eccezione possibile. Patrick ha un buon punto che OutOfMemoryException
non dovrebbe essere trattato in questo modo. Quindi, cosa succede se voglio ignorare ogni eccezione tranne OutOfMemoryException
?