10
votes

Jouant notimplementaedException sur l'affaire par défaut dans l'instruction de commutation

devrais-je lancer un notimpledexception () sur par défaut , si j'ai des cas pour tous les types d'énumjets possibles?


1 commentaires

Je suppose que cela dépend de votre application et de ce qui se passerait si vous avez fini par une valeur hors limites.


10 Réponses :


0
votes

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à.


0 commentaires

2
votes

Cela ressemble à une option raisonnable.

Personnellement, je créerais un nouveau type d'exception (peut-être un InvalidénumException ou donnez-lui un autre nom qui aura du sens à l'équipe de support) et de jette ça.


2 commentaires

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é.



1
votes

Je jetterais ApplicationException 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.


1 commentaires

L'utilisation d'ApplicationException n'est-elle pas fronçée?



0
votes

Je dirais au moins vous devriez mettre un débog.fail () là.

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.


0 commentaires

4
votes

Peut-être pas notimplementedException, mais argumentException. Cela dépendrait vraiment de l'endroit où vous l'utilisez.


0 commentaires

1
votes

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


0 commentaires

0
votes

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.


0 commentaires

0
votes

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.


0 commentaires

13
votes

Si vous recherchez une valeur qui doit , 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.

Mais maintenant, vous devez envisager le contexte.

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.

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).

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 valeur entière 32 bits.

Donc, en bref, si votre méthode est destinée à la consommation publique, Oui, par tous les moyens, jetez. Si ce n'est pas pour la consommation publique, Aster .


5 commentaires

+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.


@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 , que devrait-il faire? L'appelant s'attend à ce que quelque chose. 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.



6
votes

Cela dépend vraiment.

  • 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.

  • 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.

  • Lorsque vous discriminez le paramètre d'entrée argumentException est toujours approprié.

  • 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.


2 commentaires

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.