190 votes

Quelles exceptions doivent être levées pour les paramètres non valides ou inattendues dans .NET ?

Quels types d’exceptions doivent être levées pour les paramètres non valides ou inattendues dans .NET ? Quand devrais-je choisir l’un plutôt qu’un autre ?

Suivi de :

Quelle exception utiliseriez-vous si vous avez une fonction qui attend un entier correspondant à un mois et que vous avez passées "42" ? Cela tomberait dans la catégorie « out of range » même s’il n’est pas une collection ?

296voto

JoshBerke Points 34238

J'aime utiliser: ArgumentException, ArgumentNullException, ArgumentOutOfRangeException

Modifier

Vous pouvez également jeter comme Yoooder souligne le soufflet (vote sa réponse jusqu'), ce qui InvalidOperationException de sens que si votre donné un argument valable, mais l'appel d'une méthode n'est pas valable pour l'argument basé sur l'état actuel.

Vous pourriez aussi jeter le NotSupportedException si les arguments passés en sont tout simplement pas pris en charge. Imaginez un client Ftp, et que vous passez une commande que le client ne prend pas en charge. Ce serait une utilisation valide.

Le truc, c'est de lancer l'exception qui exprime le mieux le pourquoi de la méthode ne peut pas être appelé dans l'état actuel.

Modifier

Merci pour le lien que j'ai mis à jour tout au point de msdn.

Modifier

En réponse à votre suivi, je voudrais jeter un ArgumentOutOfRangeException, regardez ce que MSDN dit à propos de cette exception:

ArgumentOutOfRangeException est levée lorsqu'une méthode est appelée, et au moins l'un des arguments passés à la la méthode n'est pas nullNothingnullptra null référence (Nothing en Visual Basic) et ne contient pas une valeur valide.

Dans ce cas, vous êtes de passage à une valeur, mais qui n'est pas une valeur valide, depuis votre portée est de 1 à 12. Cependant, la manière de documenter clairement ce que votre API lancers. Parce que bien que je pourrais dire ArgumentOutOfRangeException un autre développeur peut dire ArgumentException. Il est facile et documenter le comportement.

Modifier

Comme Yoooder souligne à nouveau dans les commentaires de documentation est bonne, mais à un point. Idéalement, l'exception doit être détaillée au sujet de ce qui s'est passé, pourquoi c'est mal, et comment le résoudre. J'aime quand les messages d'erreur de point à l'aide de la documentation ou d'autres ressources.

Par exemple, Microsoft a fait une bonne première étape avec cette. Lorsque vous rencontrez l'erreur, ils vous disent dans l'erreur messgae l'article base de connaissances. Ce qu'ils ne font pas bien, c'est raconter pourquoi vous plus particulièrement, elle a échoué.

47voto

STW Points 15326

J'ai voté pour Josh réponse, mais souhaitez ajouter un de plus à la liste:

Système.InvalidOperationException devrait être levée si l'argument est valable, mais l'objet est dans un état où l'argument ne doit pas être utilisé.

Mise à jour Prises à partir de MSDN:

InvalidOperationException est utilisé dans les cas où le défaut d'invoquer un la méthode est causée par des raisons autres que les arguments non valides.

Disons que votre objet a une PerformAction(enmSomeAction action) méthode, valable enmSomeActions sont à Ouvrir et à Fermer. Si vous appelez PerformAction(enmSomeAction.Ouverte), deux fois dans une ligne, puis la deuxième appel devriez jeter l'exception InvalidOperationException (depuis le arugment est valide, mais pas pour l'état actuel de la commande)

Puisque vous êtes déjà faire la bonne chose en programmation, sur la défensive, j'ai une autre exception à mentionner est ObjectDisposedException. Si votre objet implémente IDisposable, alors vous devriez toujours avoir une variable de classe suivi de l'éliminés de l'état; si votre objet a été éliminé et une méthode est appelée sur il vous faut-il augmenter le ObjectDisposedException:

public void SomeMethod()
{
    If (m_Disposed) {
          throw new ObjectDisposedException("Object has been disposed")
     }
    // ... Normal execution code
}

Mise à jour: pour répondre À votre suivi: C'est un peu d'une situation ambiguë, et est un peu plus compliqué par un générique (pas dans le .NET Génériques sens) type de données utilisées pour représenter un ensemble spécifique de données; un enum ou d'un autre objet fortement typé serait un plus idéal-mais nous n'avons pas toujours ce contrôle.

Personnellement, je ne penchent en faveur de la ArgumentOutOfRangeException et de fournir un message qui indique les valeurs valides sont 1-12. Mon raisonnement est que, quand vous parlez d'un mois, en supposant que tous les entiers représentations de mois sont valides, alors vous vous attendez à une valeur dans la gamme de 1 à 12. Si seulement certains mois (comme les mois qui ont 31 jours) ont été valide alors vous ne serait pas traiter avec une Gamme per se et je voudrais jeter un générique ArgumentException qui a indiqué les valeurs valides, et je voudrais aussi le document dans la méthode de commentaires.

39voto

Daniel Brückner Points 36242

En fonction de la valeur réelle et de ce que l'exception qui convient le mieux:

Si ce n'est pas assez précise, juste dériver votre propre classe d'exception à partir de ArgumentException.

Yoooder réponse m'a éclairé. Une entrée est invalide si elle n'est pas valide en tout temps, tandis qu'une entrée est inattendu si elle n'est pas valable pour l'état actuel du système. Donc, dans ce dernier cas, une InvalidOperationException est un choix raisonnable.

6voto

Syed Tayyab Ali Points 1667

exception d’argument.

  • System.ArgumentException
  • System.ArgumentNullException
  • System.ArgumentOutOfRangeException

4voto

Benoit Points 39210

ArgumentException:

ArgumentException est levée lorsqu'une la méthode est invoquée et au moins l'un des les arguments passés ne répond pas aux spécification de paramètre de l'appelé la méthode. Toutes les instances de ArgumentException doivent porter une message d'erreur significatif décrivant l'argument non valide, ainsi que le plage de valeurs pour le argument.

Quelques sous-classes existent également pour des types spécifiques d'invalidité. Le lien a les résumés des sous-types et quand ils doivent s'appliquer.

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