Definitivamente, eu argumentaria que há uma falha no design se você sentir a necessidade de lançar exceções de um criador de propriedades ou um criador de propriedades.
Uma propriedade é uma abstração que representa algo que é apenas um valor . E você deve poder definir um valor sem temer que isso possa gerar uma exceção. *
Se definir a propriedade resultar em um efeito colateral, isso realmente deve ser implementado como um método. E se não produzir efeitos colaterais, nenhuma exceção deve ser lançada.
Um exemplo já mencionado em uma resposta diferente é a Stream.Position
propriedade Isso produz efeitos colaterais e pode gerar exceções. Mas esse configurador de propriedades é basicamente apenas um invólucroStream.Seek
que você poderia chamar.
Pessoalmente, acredito que a posição não deveria ter sido uma propriedade gravável.
Outro exemplo em que você pode ser tentado a lançar uma exceção de um configurador de propriedades está na validação de dados:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
Mas existe uma solução melhor para esse problema. Introduza um tipo representando um endereço de email válido:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
A Email
classe garante que não possa conter um valor que não seja um endereço de email válido, e as classes que precisam armazenar emails ficam isentas do dever de validá-las.
Isso também leva a uma maior coesão (um indicador de bom design de software) - o conhecimento sobre o que é um endereço de e-mail e como é validado existe apenas no Email
classe, que tem apenas essa preocupação.
* ObjectDisposedException é a única exceção válida (sem trocadilhos) que posso pensar no momento.