47 votes

Une gestion des exceptions plus élégante que plusieurs blocs de capture?

En utilisant C #, existe-t-il un meilleur moyen de gérer plusieurs types d'exceptions plutôt qu'un tas de blocs d'interception laids?

Qu'est-ce qui est considéré comme la meilleure pratique pour ce type de situation?

Par exemple:

 try
{
    // Many types of exceptions can be thrown
}
catch (CustomException ce)
{
    ...
}
catch (AnotherCustomException ace)
{
    ...
}
catch (Exception ex)
{
    ...
}
 

71voto

Reed Copsey Points 315315

À mon avis, un tas de blocs "laids" est le meilleur moyen de gérer cette situation.

La raison pour laquelle je préfère ceci est que c'est très explicite. Vous indiquez explicitement quelles exceptions vous souhaitez gérer et comment elles doivent être gérées. Les autres formes d’essai visant à fusionner la manipulation en des formes plus concises perdent la lisibilité dans la plupart des cas.

Mon conseil serait de m'en tenir à cela et de gérer les exceptions que vous souhaitez gérer explicitement, chacune dans son propre bloc catch.

21voto

DOK Points 21175

Je suis d'accord avec Reed: c'est la meilleure approche.

J'ajouterais ces commentaires:

Seulement attraper quelque chose que vous allez faire quelque chose. Si vous ne pouvez pas résoudre le problème, il est inutile d'attraper une exception spécifique.

Ne pas abuser des blocs d'arrêt. Dans de nombreux cas où l'exception ne peut pas être résolue, il est préférable de laisser cette exception bulle jusqu'à un point central (tel que Page_Error) et de la récupérer. Ensuite, vous enregistrez l'exception et affichez un message à l'utilisateur.

15voto

Mark Brackett Points 46824

La seule autre chose que vous puissiez faire est d’émuler les filtres d’exception de VB.NET:

 try {
    DoSomething();
} catch (Exception e) {
    if (!ex is CustomException && !ex is AnotherCustomException) {
       throw;
    }
    // handle
}
 

Parfois c'est mieux, parfois pas. Je l'utilisais principalement s'il y avait une logique commune que je voulais dans le gestionnaire, mais les exceptions ne partagent pas un type de base.

10voto

Kent Boogaart Points 97432

Malheureusement, C# n'a pas l'utilisateur de filtres d'exception comme VB.NET, de sorte que vous êtes limité à:

  1. La capture d'un ancêtre commun à toutes les exceptions. Cela peut ou peut ne pas être ce que vous voulez, car il y a peut être un autre descendant les types d'exception que vous ne voulez pas attraper.
  2. Le déplacement de la logique de gestion des exceptions en une autre méthode et l'appel que de chaque gestionnaire.
  3. Répéter la logique d'exception pour chaque gestionnaire.
  4. Le déplacement de la logique de gestion des exceptions dans un langage qui prend en charge les filtres, tels que VB.NET.

5voto

user94636 Points 31

Si vous avez besoin d'écrire une très grosse quantité de code comme celui-ci, je vous conseillerais de vérifier un framework AOP . Personnellement, j'utilise PostSharp . Ensuite, vous pouvez masquer tout le code de gestion des exceptions en aspects.

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