Quelle est la bonne .NET exception à jeter lorsque vous essayez d'insérer une copie de l'objet dans une collection?

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai un Atout objet a une propriété AssignedSoftware, qui est une collection.

Je veux faire en sorte que le même morceau de Logiciel n'est pas attribuée à un Actif plus d'une fois.Dans la méthode Add-je vérifier pour voir si le Logiciel existe déjà, et si elle le fait, je veux lancer une exception.

Est-il un standard .NET exception que je devrais être jeter?Ou ne meilleures pratiques, j'ai créer mon propre exception?

Était-ce utile?

La solution

À partir de la Bibliothèque de classes de conception de lignes directrices pour les erreurs (http://msdn.microsoft.com/en-us/library/8ey5ey87(SV.71).aspx):

Dans la plupart des cas, utilisez l'exception prédéfinie types.Seulement de définir de nouveaux types d'exception pour la programmation de scénarios, où vous attendent les utilisateurs de votre bibliothèque de classe pour attraper les exceptions de ce type et d'exécuter des programmes d'action basé sur le type d'exception elle-même.C'est en lieu et place de l'analyse de l'exception de la chaîne, ce qui aurait un impact négatif sur les performances et maintenance.

...

Lever une exception d'argument ou de créer une exception dérivées de cette classe si les paramètres non valides sont passés ou détectés.

Jeter l'exception InvalidOperationException si un appel à une propriété accesseur set ou la méthode n'est pas appropriée compte tenu de l'objet dans son état actuel.

Cela semble être un "état d'Objet non valide" scénario pour moi, donc je choisirais InvalidOperationException sur ArgumentException:Les paramètres sont valides, mais pas à ce point dans les objets de la vie.

Autres conseils

Pourquoi InvalidOperationException été accepté comme réponse?!Il devrait être un ArgumentException?!

InvalidOperationException doit être utilisé si l'objet ayant la méthode/propriété appelée contre il n'est pas en mesure de faire face à la demande en raison de uninit ed état, etc.Le problème ici est pas l'objet Ajouté, mais l'objet est transmis à l'objet (c'est un double). Pensez à ce sujet, si ce complément d'appel n'a jamais eu lieu, l'objet encore fonctionner normalement, OUI!

Ce devrait être un ArgumentException.

.Net va jeter un Système.ArgumentException si vous essayez d'ajouter un élément à une table de hachage deux fois avec la même valeur de clé, de sorte qu'il ne ressemble pas il y a quelque chose de plus spécifique.Vous pouvez écrire votre propre exception si vous avez besoin de quelque chose de plus spécifique.

Vous devriez jeter probablement ArgumentException, comme c'est ce que la base de la bibliothèque de classes.

Eh bien, si vous voulez vraiment une collection de pièces uniques, vous voudrez peut-être jeter un oeil à la HashSet objet (disponible en C# 3.0).

Sinon, il existe deux approches que vous pouvez prendre:

  • Créer une exception personnalisée de votre opération, tout comme vous l'aviez dit
  • Mettre en œuvre une méthode Add() qui renvoie une valeur booléenne:vrai si l'élément est ajouté, et false si l'élément possède déjà un doublon dans la collection

L'approche peut être considérée comme meilleure pratique, aussi longtemps que vous êtes cohérent dans son utilisation.

J'ai toujours aimé l'exception InvalidOperationException.Cependant, vous pouvez également créer une exception personnalisée, dire un DuplicateSoftwareAssignmentException.


Dans le cadre des lignes directrices de conception:

"Lancer une exception d'argument ou de créer une exception dérivées de cette classe si les paramètres non valides sont passés ou détecté.

Jeter le InvalidOperationException exception si un appel à un ensemble de propriétés accesseur ou méthode n'est pas appropriée compte tenu de l'objet dans son état actuel."

L'état actuel comprend des références à d'autres instances de classe.Dans ce cas, l'état comprend déjà une référence à l'instance en cours ajoutée, donc l'appel à la méthode est inappropriée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top