39 votes

Est-il possible de dériver de System.ArgumentException?

Si j'ai une méthode qui vérifie la validité de ses arguments, est-ce ok pour lancer ma propre exceptions dérivées à partir d' System.ArgumentException? Je demande car ArgumentException est elle-même dérivée d' System.SystemException et je vois des lignes directrices contradictoires quant à savoir si une application doit dériver de l' SystemException. (Bien qu'indirectement, découlant de l' ArgumentException est encore équivalent à découlant de l' SystemException.)

Je vois beaucoup de lignes directrices dit de ne découle pas d' ApplicationException,, mais découlent de l'Exception à la place. J'en suis heureux. Ce que je ne suis pas sûr à ce sujet est de savoir si c'est ok pour en tirer SystemException trop.

Si je ne découle pas d' SystemException, alors que dois-je tirer mon "invalid argument" classes d'exception à partir de?

40voto

Botz3000 Points 23640

La page MSDN sur les meilleures pratiques pour la gestion des exceptions indique

Lance une exception ArgumentException ou une classe dérivée de ArgumentException si des paramètres non valides sont passés.

Donc, je dirais que c'est correct et même recommandé.

7voto

dbattaglia Points 407

L'un des avantages de dériver de System.ArgumentException est que les blocs catch(System.ArgumentException) peuvent gérer votre type d'exception personnalisé ainsi que System.ArgumentException . Cela peut être ou ne pas être ce que vous voulez.

5voto

Dennis Traub Points 24186

Si vous voulez dériver vos exceptions "argument invalide" et qu'elles n'ont pas de signification autre que cela, alors ArgumentException ressemble à un candidat raisonnable:

ArgumentException est levée lorsqu'une méthode est appelée et qu'au moins un des arguments transmis ne correspond pas à la spécification de paramètre de la méthode appelée. --MSDN

4voto

Trevor Pilley Points 7304

L'idée originale derrière exceptions dans .Net est que les exceptions dans les bibliothèques de classes de base (par exemple le Système des assemblées) permettrait de lancer des exceptions qui découlent de System.Exception et a indiqué que toutes les exceptions héritent d' System.ApplicationException de différencier entre la BCL exceptions et l'application des exceptions cependant Microsoft a fait marche arrière sur cette idée et suggèrent maintenant que toutes les exceptions héritent d' System.Exception.

Mon conseil est d'hériter de la plus faible Exception de la classe dans le cadre qui a du sens.

Si votre exception signifie quelque chose de précis, d'autres qu'il y a un problème avec cet argument, par exemple, le type peut ajouter de la sémantique à l'exception (comme ArgumentNullException et ArgumentOutOfRangeException faire), puis faire une personnalisée, si pas alors utiliser ArgumentException et offre un véritable message de l'exception.

2voto

peer Points 11386

Si vous réutilisez à 100% les propriétés ArgumentException et ajoutez des fonctionnalités supplémentaires, tout ira bien. Cependant, si vous ne le réutilisez que pour son nom, tout ne serait pas bien.

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