11 votes

En C#, comment savoir quelles exceptions attraper ?

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 ?

19voto

Greg D Points 24218
  1. 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).

  2. 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 y ArgumentException . 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.

5voto

Matt Greer Points 29401

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
}

3voto

Kyle Rozendo Points 15606

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 :

2voto

Tejs Points 23834

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.

1voto

Sunny Points 3189

IMO - n'attrapez pas d'exception à moins que vous ne prévoyiez d'y ajouter de la valeur et/ou qu'elle ne puisse être traitée que par cette méthode.

Veuillez avoir un gestionnaire d'exception commun qui gère toutes les exceptions non gérées.

HTH.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X