devrais-je lancer un notimpledexception () code> sur
par défaut code>, si j'ai des cas pour tous les types d'énumjets possibles? P>
10 Réponses :
Cela dépend vraiment du processus spécifique, mais oui, c'est un bon processus de réagir en défaut: cas si quelque chose n'était pas censé être là. P>
Cela ressemble à une option raisonnable. p>
Personnellement, je créerais un nouveau type d'exception (peut-être un InvalidénumException Code> ou donnez-lui un autre nom qui aura du sens à l'équipe de support) et de jette ça. P>
J'essaie personnellement de réutiliser l'une des myriades des types d'exception existants. blogs. msdn.com/jareedpar/archive/2008/10/20/...
D'accord, Townvoted parce que je ne pense pas que ce soit une affaire pour un type d'exception personnalisé.
Je jetterais ApplicationException code> car si votre code atteint par défaut et que vous ne l'avez pas attendu, cela signifie que quelque chose dans votre code ne se comporte pas lorsque vous pensez. P>
L'utilisation d'ApplicationException n'est-elle pas fronçée?
Je dirais au moins vous devriez mettre un Vous devez jeter une exception au cas où la méthode ne peut en aucun cas continuer. Mais si vous êtes comme convertir vos valeurs ENUM en des représentations de chaîne, vous pouvez simplement retourner une chaîne d'avertissement à la place. Le produit ne s'écrasera pas sur les utilisateurs en raison d'une erreur évidente, il y aura probablement une solution de contournement et tout le monde sera heureux. P> débog.fail () code> là. p>
Peut-être pas notimplementedException, mais argumentException. Cela dépendrait vraiment de l'endroit où vous l'utilisez. P>
Cela dépend vraiment de votre cas d'utilisation. Il sera utile que vous lancez une exception au début de l'intégration. Les utilisateurs de votre bibliothèque peuvent immédiatement connaître les erreurs p>
Si vous avez jeté l'exception, ce qui se passerait? Dans quel contexte est exécuté l'instruction de commutation? Cette situation devait-elle jamais arriver? Devrait-il jamais arriver au moment de la course dans le code de production? Est-ce que vos tests de l'unité couvrent cette situation? Si oui, peut-être une assertion serait mieux. P>
Vous devriez d'abord considérer ce que cela signifierait si vous avez une valeur en dehors des cas connus, que la variable étant allumée est-elle représente? Ensuite, vous pouvez simplement utiliser un type d'exception qui correspond à ce qui se passe réellement. p>
Si vous recherchez une valeur qui doit em>, par définition, correspond à la valeur d'une énumération, et que vous avez reçu autre chose, c'est certainement un argument non valide. P>
Mais maintenant, vous devez envisager le contexte. P>
est la méthode privée et accessible uniquement par des membres de votre bibliothèque ou une application de classe? Si c'est le cas, c'est une erreur de codage qui ne devrait jamais se produire en premier lieu. Affirmer et échouer. P>
Si, d'autre part, c'est une méthode publique ou protégée, et peut être consulté par les clients consommant votre bibliothèque, vous devez absolument jeter avec un message significatif (et de préférence un type d'exception bien connu). P>
Il est important de rappeler que les énumérations ne sont pas enregistrées dans le cadre. Je peux préciser qu'une méthode nécessite un paramètre de type environnement.Spécialfolder; Mais cela acceptera tout em> valeur entière 32 bits. p>
Donc, en bref, si votre méthode est destinée à la consommation publique, Oui, par tous les moyens, jetez. EM> Si ce n'est pas pour la consommation publique, Aster . P>
+1 bien dit. Si la valeur inattendue vient de votre choix, affirmez et échouez. D'autre part, s'il provient de quelqu'un d'autre à l'aide de votre code, vous devez vous lancer une exception et donner au code d'appel une chance de récupérer.
Pourquoi affirme-t-il mieux que de jeter? Peut-être que cette condition est un cas rare et que le développeur ne le frappe pas, et il n'est frappé que par le testeur, qui utilise la construction de déverrouillage (sans assert compilé) et l'erreur est avalée. Est-il préférable d'avaler les erreurs, n'écrasez pas, mais faites du mal à déboguer une chose incorrecte, au lieu de vous écraser avec une trace de pile?
Une autre question est la quantité de vérification des erreurs à mettre en code, si vous n'écrivez pas à des API pour d'autres entreprises? Short Code est que je pense plus lisible que le code dans lequel chaque taille de méthode est doublée en raison de la vérification des erreurs. N'est-ce pas?
@csuporj - En ce qui concerne votre première question, si vous êtes inquiet des bugs vraiment obscurs, utilisez l'échec à la place. Un bug qui est que l'obscure va glisser de toute façon. On peut espérer atténuer ces circonstances avec des tests d'unités approfondies et des tests d'assurance qualité avant, mais Il n'y a pas de logiciel moderne sans bug. I>
@csuporj - Concernant votre deuxième question, la vérification des erreurs et le cas par défaut dans une structure de commutation ne sont pas exactement la même chose. Il doit faire quelque chose de spécifique en fonction de la valeur de l'énumération. Si ce n'est pas l'une des valeurs connues de l'énumération i>, que devrait-il faire? L'appelant s'attend à ce que quelque chose. I> et si le type de paramètre spécifie une valeur d'énumération, autre chose que cela est une violation du contrat de la méthode. Défaut de s'assurer que cela conduit à votre première question.
Cela dépend vraiment. P>
the notimpledException est quelque chose comme TODO marque pour moi. Cela signifie que quelqu'un viendra plus tard pour terminer le code. Cependant, je ne pense pas que ce soit cas d'affaire par défaut qui ne devrait pas arriver. P> li>
Lorsque vous vérifiez l'état de l'objet, vous pouvez envisager InvalidOperationException . Votre méthode est conçue uniquement pour travailler avec les cas existants. P> li>
Lorsque vous discriminez le paramètre d'entrée argumentException A> est toujours approprié. p> li>
Dans d'autres cas, je préfère notsupportedexception . Il indique légèrement que quelque chose ne va pas avec la plate-forme ou la version. Et les versions incompatibles du code sont la principale racine du problème lorsque le cas d'interrupteur par défaut ne devrait pas se produire. P> li>
ul>
réponse intéressante. Quelle est votre motivation / raisonnement?
Excellente réponse, merci pour la mise à jour. Je suis complètement d'accord avec vous ce que vous avez mis. Cela m'a aidé à le faire droit dans ma propre tête.
Je suppose que cela dépend de votre application et de ce qui se passerait si vous avez fini par une valeur hors limites.