J'écris du code d'accès aux données et je souhaite vérifier les états de données "non valides" dans la base de données. Par exemple, je retourne un widget hors de la base de données et j'attends seulement un. Si je reçois deux, je veux jeter une exception. Même si l'intégrité référentielle devrait l'empêcher de se produire, je ne veux pas dépendre du DBAS ne modifiant jamais le schéma (pour clarifier cela si la contrainte principale de clé est supprimée et que je reçois une dupe, je veux casser rapidement et clairement). p>
J'aimerais utiliser le système.IO.InvalidDataException, sauf que je ne traite pas d'un flux de fichiers, il serait donc trompeur. J'ai fini par aller avec une application génériqueException. Quelqu'un a une meilleure idée? P>
4 Réponses :
Vous pouvez écrire une exception personnalisée si vous ne trouvez aucune exception standard appropriée ... p>
Mais vous dites: p>
même si l'intégrité référentielle devrait empêcher cela de se produire, je ne veulent pas dépendre du dbas ne change jamais le schéma. p> blockQuote>
Lorsque quelqu'un change le schéma de base de données, les modifications sont assez grandes que vous devrez également apporter des modifications à votre code d'application / d'accès aux données ... p>
Euh, j'ai dit ça faux. Je veux juste que l'erreur de la surface rapide est que le schéma est devenu sous moi. Je sais que je pourrais créer une exception personnalisée, mais je voulais m'assurer que je ne manquante pas une bonne valeur par défaut.
Si vous avez besoin d'une exception qui décrirait exactement la situation que vous traitez, pourquoi ne pas faire de votre propre exception? P>
Il suffit de le hériter de System.Exception. P>
J'essayais simplement de suivre les conseils de Brad Abram et je voulais m'assurer que je ne manquante pas une exception intégrée appropriée: blogs.msdn.com/brada/archive/2005/03/27/402801.aspx
+1 Créer votre propre exception serait mon conseil aussi - c'est votre ami lors du suivi des erreurs. Encore plus, en ce qui concerne les limites et les contraintes liées à votre application ou à votre logique professionnelle.
Je pourrais être tenté d'utiliser l'une des opérations suivantes: p>
InvalidConstraintSException
NotsupportedException
OverflowException p>
ou, allez-y et créez la mienne: ToomanyRowSeXception P>
Cela fait sonner comme si la contrainte elle-même est invalide - violéconstraintSException ou contrainteViolationException?
@Jon: D'une certaine manière c'est une contrainte qui a été violée. Dans son cas, la contrainte existe, il a juste peur de la base de données qui le dépose.
Vous êtes efficacement désérialisant des données d'un magasin. Il se trouve être un SGBDM, mais c'est relativement sans importance. Les données sont invalides, donc Pour le mettre un autre moyen - si vous étaient em> charger les données à partir d'un fichier, utiliseriez-vous InvalidDataException code> semble assez raisonnable pour moi: p>
InvalidDataException code> convient bien. P>
invaliddataException code>? En supposant que vous le feriez, pourquoi cela devrait-il compter où les données proviennent, en termes d'exception étant lancée? P>
Oui, je l'utiliserais pour charger des données à partir d'un fichier - je suis d'accord avec votre logique. Je vais aller de l'avant et utiliser InvalidDataException.
C'est probablement en effet la classe d'exception existante la plus appropriée. Il se sent simplement bizarre IMHO - malgré l'argument de la flux de données de @jon Skeet - pour lancer une exception à partir de l'espace de noms code> code> lorsque vous faites system.data code> -Related. (Bien sûr, la signification concrète des espaces de noms ne devrait pas être surestimate, mais elle transmet toujours un message subtil que ce n'est peut-être pas assez i> la bonne chose à jeter.) Je pense que dans ce cas, fournissant Une classe d'exception personnalisée serait justifiée.
Personnellement, je suis en train de lancer des exceptions de cadre indigène du code non-cadre pour la raison pour laquelle les demandes d'appui ne peuvent pas être correctement dirigées. Peut-être qu'une sous-classe appelée ApplicationInvalidDataException serait appropriée?
C'est dans une perspective intéressante. Je peux certainement voir la valeur dans la mesure de configuration des processus / des chemins d'escalade pour des exceptions personnalisées. Je vais devoir donner cela quelque chose cependant.
Je trouve cela difficile à avaler pour la même raison donnée par Stakx. Je suis surpris que ce type d'approche ne soit généralement pas découragé. Existe-t-il un précédent ou des directives officiels »pour utiliser des exceptions qui résident dans des espaces de noms étrangers ou apparemment non liés?
@RORYAP: Pas que je sache. Ces jours-ci, je peut-être i> préférer créer ma propre exception à la place ... mais s'il s'agit d'une situation où l'intégrité référentielle devrait vraiment être manipulée, je pense toujours invalidedataException code> est raisonnable.
Pour complétude: il existe également system.data.dataException code>. Pas sûr, c'est que ce serait meilleur choix que
system.io.invaliddataException code>.