J'ai pris l'habitude d'utiliser une déclaration catch générale et je traite ces exceptions de manière générale. Est-ce une mauvaise pratique ? Dans l'affirmative, comment puis-je savoir quelles exceptions spécifiques peuvent être levées et lesquelles dois-je attraper ?
Réponses
Trop de publicités?-
Oui, sauf dans quelques cas très spécifiques où c'est une mauvaise pratique. Le seul cas courant auquel je pense où attraper toutes les exceptions n'est pas une mauvaise idée est celui où vous enregistrez un message ou une trace de pile juste avant que l'application ne soit sur le point de se détruire (ou, peut-être, vous enregistrez et relancez).
-
Ne retenez que les exceptions que vous savez pouvoir gérer. Pas plus, pas moins. Si vous ne savez pas qu'une exception peut être levée par une méthode, vous ne la gérerez pas correctement de toute façon, alors ne l'attrapez pas. Les méthodes et les bibliothèques sont responsables de la documentation des exceptions que vous devez être en mesure de gérer. De même, n'attrapez pas les exceptions qui indiquent un échec logique, telles que
NullReferenceException
yArgumentException
. Ils indiquent un véritable bogue dans votre logiciel que vous devez corriger, et non quelque chose que vous devez gérer au moment de l'exécution.
Oui, c'est une mauvaise pratique. Règle générale : "attrapez les exceptions auxquelles vous êtes en mesure de répondre, laissez les autres de côté."
try {
File.Open(usersChosenFile, FileMode.Open);
} catch(FileNotFoundException) {
// tell the user the file is gone, give them a chance to respond
// this is good
} catch(UnauthorizedAccessException) {
// this is good too
} catch(Exception) {
// what did you just catch? Who knows. What if its OutOfMemoryException?
// Do you really want to deal with that here? Let this one go by
}
Les méthodes que vous exécutez indiquent généralement quelles exceptions peuvent être levées. Vous pouvez alors les attraper en conséquence.
S'il s'agit de votre propre code, vous pouvez généralement voir ce qui sera lancé, ou utiliser les exceptions des classes sous-jacentes comme guide sur ce que vous devrez attraper.
Je vous recommande quelques liens :
La question la plus importante est de savoir si vous devez effectuer un traitement d'erreur spécifique pour des exceptions spécifiques. Si vous devez simplement attraper toutes les erreurs qui se produisent, il n'y a rien de mal à créer un bloc try/catch générique :
try
{
// Some Code
}
catch
{
}
Toutefois, si vous devez traiter spécifiquement certaines exceptions, vous pouvez spécifier plusieurs blocs catch pour un seul essai :
try
{
// Some Code
}
catch(ArgumentException argE)
{
}
catch(NullReferenceException nullE)
{
}
catch(Exception e)
{
// Everything else
}
Si vous ne pouvez pas récupérer une exception, ne l'attrapez pas à ce niveau.
- Réponses précédentes
- Plus de réponses