Qual é a exceção .NET correta a ser lançada ao tentar inserir um objeto duplicado em uma coleção?

StackOverflow https://stackoverflow.com/questions/54789

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho um objeto Asset que possui uma propriedade AssignedSoftware, que é uma coleção.

Quero ter certeza de que o mesmo software não seja atribuído a um ativo mais de uma vez.No método Add, verifico se o software já existe e, se existir, quero lançar uma exceção.

Existe uma exceção padrão do .NET que eu deveria lançar?Ou as práticas recomendadas determinam que eu crie minha própria exceção personalizada?

Foi útil?

Solução

Nas diretrizes de design da Biblioteca de Classes para erros (http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):

Na maioria dos casos, use os tipos de exceção predefinidos.Defina novos tipos de exceção somente para cenários programáticos, onde você espera que os usuários de sua biblioteca de classes capturem exceções desse novo tipo e executem uma ação programática baseada no próprio tipo de exceção.Isso substitui a análise da cadeia de exceção, o que afetaria negativamente o desempenho e a manutenção.

...

Lance uma ArgumentException ou crie uma exceção derivada desta classe se parâmetros inválidos forem passados ​​ou detectados.

Lançar a exceção InvalidOperationException se uma chamada para um acessador ou método de conjunto de propriedades não for apropriada, dado o estado atual do objeto.

Para mim, isso parece um cenário de "estado do objeto inválido", então eu escolheria InvalidOperationException em vez de ArgumentException:Os parâmetros são válidos, mas não neste ponto da vida do objeto.

Outras dicas

Por que InvalidOperationException foi aceita como resposta?!Deveria ser um ArgumentException?!

InvalidOperationException deve ser usado se o objeto que tem o método/propriedade chamado não for capaz de lidar com a solicitação devido ao estado não iniciado, etc.O problema aqui é não o objeto que está sendo adicionado, mas o objeto que está sendo passado para o objeto (é um idiota). Pense nisso, se essa chamada Add nunca ocorresse, o objeto ainda funcionaria normalmente, SIM!

Este deveria ser um ArgumentoException.

.Net lançará uma System.ArgumentException se você tentar adicionar um item a uma tabela hash duas vezes com o mesmo valor de chave, então não parece que haja algo mais específico.Você pode escrever sua própria exceção se precisar de algo mais específico.

Você provavelmente deveria lançar ArgumentException, pois é isso que as classes da biblioteca base fazem.

Bem, se você realmente quer uma coleção com itens exclusivos, você pode querer dar uma olhada no Objeto HashSet (disponível em C# 3.0).

Caso contrário, existem duas abordagens que você pode adotar:

  • Crie uma exceção personalizada para sua operação, conforme declarado
  • Implemente um método Add() que retorne um resultado booleano:verdadeiro se o item for adicionado e falso se o item já tiver uma duplicata na coleção

Qualquer abordagem pode ser considerada prática recomendada, desde que você seja consistente em seu uso.

Sempre gostei do InvalidOperationException.No entanto, você também pode criar uma exceção personalizada, digamos, uma DuplicateSoftwareAssignmentException.


Das diretrizes de design da estrutura:

"Jogue uma ArgumentException ou crie uma exceção derivada desta classe se os parâmetros inválidos forem passados ​​ou detectados.

Jogue a exceção do InvalidoPerationException se uma chamada para um acessador ou método do conjunto de propriedades não for apropriado, dado o estado atual do objeto. "

O estado atual inclui referências a outras instâncias de classe.Neste caso, o estado já inclui uma referência à instância que está sendo adicionada, portanto a chamada ao método é inadequada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top