プロパティセッターまたはゲッターから例外をスローする必要があると感じた場合、設計に欠陥があると私は間違いなく主張します。
プロパティは、単なる値である何かを表す抽象化です。また、例外をスローすることを恐れずに値を設定できるはずです。*
プロパティを設定すると副作用が発生する場合は、代わりにメソッドとして実際に実装する必要があります。また、副作用が発生しない場合、例外はスローされません。
別の回答ですでに言及されている1つの例は、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は、現時点で考えられる唯一の有効な例外です(しゃれはありません)。