Je dirais certainement qu'il y a une faille dans la conception si vous ressentez le besoin de lever des exceptions à partir d'un setter de propriété ou d'un getter.
Une propriété est une abstraction qui représente quelque chose qui n'est qu'une valeur . Et vous devriez pouvoir définir une valeur sans craindre que cela ne lève une exception. *
Si la définition de la propriété entraîne un effet secondaire, cela devrait vraiment être implémenté en tant que méthode. Et si cela ne produit aucun effet secondaire, aucune exception ne doit être levée.
Un exemple déjà mentionné dans une réponse différente est la Stream.Position
propriété. Cela produit des effets secondaires et peut lever des exceptions. Mais cet ensemble de propriétés n'est en fait qu'un wrapper Stream.Seek
que vous pourriez appeler à la place.
Personnellement, je crois que le poste n'aurait pas dû être une propriété accessible en écriture.
Un autre exemple où vous pourriez être tenté de lever une exception à partir d'un ensemble de propriétés est dans la validation des données:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
Mais il existe une meilleure solution à ce problème. Introduisez un type représentant une adresse e-mail valide:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
La Email
classe s'assure qu'elle ne peut pas contenir une valeur qui n'est pas une adresse e-mail valide, et les classes qui ont besoin de stocker des e-mails sont déchargées de l'obligation de les valider.
Cela conduit également à une cohésion plus élevée (un indicateur d'une bonne conception logicielle) - la connaissance de ce qu'est une adresse e-mail et de la façon dont elle est validée n'existe que dans la Email
classe, qui n'a que cette préoccupation.
* ObjectDisposedException est la seule exception valide (sans jeu de mots) à laquelle je peux penser en ce moment.