J'ai voté pour la réponse de Josh , mais j'aimerais en ajouter une de plus à la liste:
System.InvalidOperationException doit être levée si l'argument est valide, mais que l'objet est dans un état où l'argument ne doit pas être utilisé.
Mise à jour prise à partir de MSDN:
InvalidOperationException est utilisé dans les cas où l'échec de l'appel d'une méthode est dû à des raisons autres que des arguments non valides.
Disons que votre objet a une méthode PerformAction (action enmSomeAction), les enmSomeActions valides sont Open et Close. Si vous appelez PerformAction (enmSomeAction.Open) deux fois de suite, le deuxième appel doit lancer l'exception InvalidOperationException (puisque l'arugment était valide, mais pas pour l'état actuel du contrôle)
Puisque vous faites déjà la bonne chose en programmant de manière défensive, j'ai une autre exception à mentionner: ObjectDisposedException. Si votre objet implémente IDisposable, vous devriez toujours avoir une variable de classe qui suit l'état supprimé; si votre objet a été supprimé et qu'une méthode est appelée dessus, vous devez lever l'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 une situation ambiguë, et est rendue un peu plus compliquée par un type de données générique (pas dans le sens .NET Generics) utilisé pour représenter un ensemble spécifique de données; un enum ou un autre objet fortement typé serait un ajustement plus idéal - mais nous n'avons pas toujours ce contrôle.
Je me pencherais personnellement vers l'exception ArgumentOutOfRangeException et fournirais un message indiquant que les valeurs valides sont de 1 à 12. Mon raisonnement est que lorsque vous parlez de mois, en supposant que toutes les représentations entières de mois sont valides, vous vous attendez à une valeur comprise entre 1 et 12. Si seuls certains mois (comme les mois qui avaient 31 jours) étaient valides, vous ne seriez pas confronté à un Range en soi et je lancerais une ArgumentException générique indiquant les valeurs valides, et je les documenterais également dans les commentaires de la méthode.