Я б напевно стверджував, що в дизайні є недолік, якщо ви відчуваєте необхідність кидати винятки з налаштованого майна або геттера.
Властивість - це абстракція, яка представляє щось, що є лише значенням . І ви повинні мати можливість встановити значення, не побоюючись, що це може призвести до виключення. *
Якщо встановлення властивості призводить до побічного ефекту, це дійсно слід реалізувати замість цього методу. І якщо це не спричинить жодних побічних ефектів, то не слід виключати жодного винятку.
Один з прикладів, що вже згадувався в іншій відповіді, - це Stream.Positionвластивість. Це призводить до побічних ефектів і може спричинити винятки. Але це налаштування властивостей - це лише обгортка, Stream.Seekяку ви можете замість цього зателефонувати.
Особисто я вважаю, що позиція не повинна була бути властивістю для запису.
Інший приклад, коли ви можете спокуситись викинути виняток із налаштування властивості, - це перевірка даних:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
Але є краще рішення цієї проблеми. Введіть тип, що представляє дійсну адресу електронної пошти:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
У Emailгарантує , що клас не може мати значення, яке не є дійсною адресою електронної пошти, і класи , які потрібно зберігати електронні листи звільняються від обов'язку перевірки їх.
Це також призводить до вищої згуртованості (показник гарного дизайну програмного забезпечення) - знання про те, що таке адреса електронної пошти та як вона перевірена, існує лише у Emailкласі, який стосується лише цієї проблеми.
* ObjectDisposedException - єдиний дійсний виняток (не призначений каламбур), про який я можу подумати на даний момент.