Je suis généralement d'accord avec la plupart des avertissements d'analyse de code et j'essaie de les respecter. Cependant, j'ai plus de difficultés avec celui-ci:
CA1031: Ne pas intercepter les types d'exception générale
Je comprends la raison d'être de cette règle. Mais, dans la pratique, si je veux faire la même chose, quelle que soit l'exception levée, pourquoi devrais-je traiter chacune d'elles spécifiquement? De plus, si je gère des exceptions spécifiques, que se passe-t-il si le code que j'appelle change pour générer une nouvelle exception à l'avenir? Maintenant, je dois changer de code pour gérer cette nouvelle exception. Considérant que si je attrape simplement Exception
mon code ne doit pas changer.
Par exemple, si Foo appelle Bar et que Foo doit arrêter le traitement quel que soit le type d'exception levée par Bar, y a-t-il un avantage à préciser le type d'exception que je intercepte?
Peut-être un meilleur exemple:
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.
}
}
Si vous ne capturez pas une exception générale ici, vous devez capturer tous les types d'exceptions possibles. Patrick a un bon point qui OutOfMemoryException
ne devrait pas être traité de cette façon. Alors que faire si je veux ignorer toutes les exceptions sauf OutOfMemoryException
?
OutOfMemoryError
, qui est séparé de l' Exception
arbre d'héritage pour cette raison même
OutOfMemoryException
? Même code de manipulation que tout le reste?