49 votes

Pourquoi les Exceptions sont tellement mauvais pour la Validation d'Entrée?

Je comprends que "les Exceptions sont pour des cas exceptionnels," [a], mais en plus il suffit d'être répété plus et plus encore une fois, je n'ai jamais trouvé une vraie raison de ce fait.

Qu'ils arrête d'exécution, il est logique que vous ne voudrais pas pour eux de la plaine de la logique conditionnelle, mais pourquoi pas une validation de l'entrée?

Dire que vous avez été à la boucle par le biais d'un groupe d'entrées et de prendre chaque exception de les regrouper pour la notification de l'utilisateur... je ne cesse de voir que c'est en quelque sorte "mauvais" parce que les utilisateurs entrent incorrect d'entrée de tous les temps, mais le point de départ semble être basée sur la sémantique.

L'entrée n'est Pas ce qui a été prévu et est donc exceptionnelle. Lancer une exception me permet de définir exactement ce qui n'allait pas comme StringValueTooLong ou ou IntegerValueTooLow ou InvalidDateValue ou quoi que ce soit. Pourquoi est-ce considéré comme mauvais?

Des Alternatives à lancer une exception est de retour (et éventuellement recueillir) un code d'erreur ou pire une erreur de chaîne de caractères. Ensuite, je voudrais montrer ce soit ceux des chaînes d'erreur directement, ou d'analyser les codes d'erreur et de montrer ensuite les messages d'erreur correspondants à l'utilisateur. Ne serait pas une exception, être considéré comme une malléable code d'erreur? Pourquoi créer une table des codes et messages d'erreur, lorsque celles-ci pourraient être généralisées à l'exception de la fonctionnalité déjà intégrée dans ma langue?

Aussi, j'ai trouvé cet article de Martin Fowler à la manière de gérer ces choses - la Notification du motif. Je ne suis pas sûr de la façon dont je vois cela comme autre chose que des Exceptions qui ne sont pas interrompre l'exécution.

a: Partout je n'ai rien lu à propos des Exceptions.

--- Edit ---

Beaucoup de grands points ont été faites. J'ai commenté sur la plupart des et +d les bons points, mais je ne suis pas encore tout à fait convaincu.

Je ne veux pas faire l'avocat des Exceptions comme le moyen le plus adapté pour résoudre de Validation de la Saisie, mais je voudrais trouver de bonnes raisons pourquoi la pratique est considérée comme tellement mal quand il semble que la plupart des solutions de rechange sont juste des Exceptions dans le déguisement.

31voto

Ned Batchelder Points 128913

La lecture de ces réponses, je trouve qu'il est très inutile de dire, "les Exceptions doivent être utilisées uniquement pour des conditions exceptionnelles". Cela pose toute la question de ce qu'est un "conditions exceptionnelles". C'est un terme subjectif, la meilleure définition de ce qui est "toute condition normale de votre flux logique de ne pas traiter avec des". En d'autres termes, un état exceptionnel, est une condition de vous traiter à l'aide d'exceptions.

Je suis très bien avec que comme une définition, je ne sais pas ce que nous allons faire plus proche que cela de toute façon. Mais vous devez savoir que c'est la définition que vous utilisez.

Si vous allez à l'encontre des exceptions dans certains cas, vous devez expliquer comment diviser l'univers des conditions "exceptionnelles" et "non exceptionnel".

À certains égards, il est similaire à répondre à la question, "où sont les frontières entre les procédures?" La réponse est: "chaque fois que vous mettez le début et la fin", et alors nous pouvons parler de règles du pouce et des styles différents pour déterminer où les mettre. Il n'existe pas de règles strictes et rapides.

22voto

Mitch Wheat Points 169614

Un utilisateur de l'entrée de 'mauvais' entrée n'est pas une exception: il faut s'y attendre.

Les Exceptions ne devraient pas être utilisées pour le contrôle de flux.

Dans le passé, de nombreux auteurs ont dit que les Exceptions sont intrinsèquement cher. Jon Skeet a blogué contrairement à ce (et mentionné un peu de temps de réponses ici, sur DONC), en disant qu'ils ne sont pas aussi cher que la signalées (bien que je ne défends pas les utiliser dans une boucle!)

La plus grande raison pour les utiliser est la "déclaration d'intention" c'est à dire si vous voyez un bloc de gestion des exceptions que vous voyez immédiatement des cas exceptionnels, qui sont traités en dehors de la circulation normale.

8voto

krosenvold Points 35979

Il y a un important autre raison que celles mentionnées déjà:

Si vous utilisez des exceptions uniquement pour des cas exceptionnels, vous pouvez exécuter dans votre débogueur le débogueur paramètre "stop quand une exception est levée". C'est extrêmement pratique, car vous vous laissez tomber dans le débogueur sur la ligne exacte qui est à l'origine du problème. À l'aide de cette fonctionnalité vous permet d'économiser une bonne quantité de temps chaque jour.

En C#, cela est possible (et je le recommande de tout coeur), surtout après avoir ajouté le TryParse méthodes pour tous le nombre de classes. En général, aucun des bibliothèques standard de besoin ou utilisez la "mauvaise" gestion des exceptions. Lorsque je m'approche d'un C# code qui n'a pas été écrit à cette norme, j'ai toujours finissent par se convertir à l'exception-gratuit-pour-les affaires ordinaires, parce que le stop-om-jet est si précieux.

Dans firebug débogueur javascript vous pouvez également le faire, mais à condition que les bibliothèques ne pas utiliser les exceptions mal.

Lorsque je programme en Java, ce n'est pas vraiment possible, car beaucoup de choses utilise des exceptions pour les non-cas exceptionnels, y compris un grand nombre de bibliothèques de base de java. Alors, cette fois-fonction d'économie n'est pas vraiment disponible pour une utilisation en java. Je crois que cela est dû à la vérification des exceptions, mais je ne vais pas commencer à rodomontades sur la façon dont ils sont mauvais.

6voto

Des erreurs et des Exceptions – Quoi, Quand et Où?

Les Exceptions sont destinés à signaler les erreurs, ce qui rend le code plus robuste. Pour comprendre quand utiliser des exceptions, il faut d'abord comprendre quelles erreurs et ce n'est pas une erreur.

Une fonction est une unité de travail, et les échecs doivent être considérées comme des erreurs ou autrement, en fonction de leur impact sur les fonctions. Au sein d'une fonction f, l'échec est une erreur si et seulement si elle empêche f à partir de la rencontre de son destinataire de l'appel de conditions préalables, la réalisation de l'un quelconque de f's propre postconditions, ou de retrouver toute l'invariant que f parts de responsabilité pour le maintien.

Il existe trois types d'erreurs:

  • une condition qui empêche la fonction à partir d'une réunion préalable (par exemple, un paramètre de restriction) d'une autre fonction qui doit être appelée;
  • une condition qui empêche la fonction de l'établissement de l'un de ses postconditions (par exemple, la production d'un valide valeur de retour est une postcondition); et
  • une condition qui empêche la fonction de ré-établir un invariant qu'il est responsable de l'entretien. C'est un type spécial de postcondition qui s'applique en particulier aux fonctions de membre. Un essentiel postcondition de tous les non-fonction membre privée, c'est qu'il doit rétablir sa classe d'invariants.

Aucune autre condition n'est pas une erreur et ne doit pas être signalé comme une erreur.

Pourquoi les Exceptions sont tellement mauvais pour la Validation d'Entrée?

Je suppose que c'est parce qu'un peu ambiguë de la compréhension de "l'entrée" comme sens d'entrée d'une fonction ou la valeur d'un champ, où cette dernière ne devrait pas lever une exception, sauf si c'est une partie de l'échec de la fonction.

5voto

JosephStyons Points 21187
  1. Maintenabilité - créer des Exceptions bizarre chemins de code, pas à la différence des GOTOs.
  2. La facilité d'Utilisation (pour les autres catégories) - D'autres classes peuvent faire confiance que les exceptions soulevées à partir de votre utilisateur d'entrée de classe sont de véritables erreurs
  3. Performance - Dans la plupart des langues, un exception encourt une performance et l'utilisation de la mémoire de la peine.
  4. Sémantique - Le sens des mots n'importe. Mauvaise entrée n'est pas "exceptionnel".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X