Quel exception à générer à partir d'une propriété setter?
J'ai une chaîne de propriété qui a une longueur maximale exigence parce que les données sont liées à une base de données. Quel exception dois-je lancer si l'appelant tente de définir une chaîne dépassant cette longueur?
Par exemple, ce code C#:
public string MyProperty
{
get
{
return _MyBackingField;
}
set
{
if (value.Length > 100)
throw new FooException("MyProperty has a maximum length of 100.");
_MyBackingField = value;
}
}
J'ai considéré ArgumentException
, mais il ne semble pas approprié. Techniquement, c'est une fonction - MyProperty_set(string value)
- si un cas de ArgumentException
peuvent être faites, mais il n'est pas d'être appelé comme une fonction aux yeux des consommateurs - c'est sur le côté droit de l'opérateur d'affectation.
Cette question pourrait également être étendu pour inclure tous les types de données de validation dans les accesseurs de propriété, mais je suis particulièrement intéressé dans le cas ci-dessus.
Vous devez vous connecter pour publier un commentaire.
Jetez un oeil à travers mscorlib.dll avec Réflecteur, dans une situation similaire à un tel Système.Chaîne de caractères.StringBuilder.La capacité de Microsoft à l'utilisation ArgumentOutOfRangeException() similaire à:
Pour moi ArgumentException (ou un enfant) a plus de sens, parce que l'argument (valeur) que vous avez fourni n'est pas valide, et c'est ce que ArgumentException a été créé pour.
Je ne lance pas d'exception à tous. - Je plutôt permettrait une chaîne de caractères de longueur quelconque et ensuite avoir une autre "Valider" méthode de la classe qui est appelée avant de l'enregistrer. Il y a un certain nombre de scénarios, en particulier si vous utilisez la liaison de données où lancer des exceptions de la propriété setters pouvez-vous obtenir dans un désordre.
La difficulté à lever des exceptions de accesseurs de propriété est que les programmeurs oubliez pas de les attraper. Ça dépend comment nettoyer vous vous attendez à ce que les données que vous arriver à être. Dans ce cas, je voudrais s'attendre à de longues longueurs de chaîne pour être courant de ne pas exceptionnel, et en tant que tel à l'aide d'une exception serait "contrôle de flux avec des exceptions".
Pour citer le Microsoft Les lignes Directrices de conception pour le Développement de Bibliothèques de Classe:
Validate
méthode est une bonne approche pour la validation des règles qui dépendent d'autres propriétés. Vous ne pouvez pas savoir les propriétés se mettre tout d'abord, il est donc préférable de vérifier à la fin.Rappelez-vous comment de nombreux problèmes dans le domaine de l'informatique ont résolu par l'ajout d'un niveau supplémentaire d'indirection?
Une approche serait de créer un nouveau type, FixedLengthString, dire. Il serait instances de que type de valider les longueurs de chaînes ils sont initialisées avec - avec un opérateur de conversion de type de conversion à partir d'une chaîne simple. Si votre propriété setter prend un tel type de son argument, alors toute violation de devenir une conversion de type exception au lieu d'un argument/propriété d'exception.
Dans la pratique, j'ai rarement le faire. Ça sent un peu de la prise OO trop loin - mais dans certains cas, il peut être une technique utile, donc je le mentionne ici par souci d'exhaustivité.
via MSDN
ArgumentException
de la série, donc +1 pour la référence.Vous pouvez utiliser InvalidOperationException. C'est un compromis. Je ne voudrais pas ennuyer à l'aide d'un ArgumentException soit.
Essayez d'utiliser les exceptions existantes où que possible. Dans ce cas, l'utilisation d'exception InvalidOperationException parce que la valeur entrante est d'amener l'objet dans un état incohérent. Personnalisé des exceptions peuvent être créés lorsqu'une manipulation spécifique à l'exception personnalisée est nécessaire. Dans ce cas, vous ne lève une exception avec un peu de texte, donc de l'utiliser à l'exception InvalidOperationException.
Lors du lancer de la InvalidOperationException montrer la valeur qui a été transmis à cette setter.