Je connais une douzaine de langages de programmation qui ont des exceptions d'une certaine manière, pourtant j'en suis venu à être témoin de deux tendances "pathologiques".
Il ne semble pas y avoir de modèle ou de hiérarchie commun d'exceptions. Chaque langue roule essentiellement sa propre version, et si les exceptions en font la norme, alors les types d'exceptions que l'on trouve dans la norme seraient plutôt arbitraires (principalement ceux qui ont été implémentés lors de la création d'outils de langue, tels que la lecture du code source à partir de chaîne ou une exception pour appeler le débogueur, ou celle qui se produit lorsque le fichier est introuvable, etc.)
Les exceptions définies par le langage sont très rarement réutilisées par les programmes utilisateurs. Il y aurait généralement une ou deux exceptions courantes ("non implémenté" par exemple). Bien que la plupart du temps, les programmeurs créent leurs propres exceptions. (Comparez cela à, par exemple, la création de nouveaux types numériques ou de nouveaux types de collection).
Cela ressemble à une terrible omission pour moi. Comment se fait-il que personne ne sait quels types d'erreurs seront nécessaires dans les programmes utilisateur? J'espérais qu'il y aurait une sorte de belle hiérarchie, similaire aux types numériques, aux collections, au système d'objets, etc.
Pire encore, Goolge et Wikipedia fournissent très peu d'aide sur le sujet. Jusqu'à présent, je n'ai trouvé qu'un article sur l'exception fonctionnelle qui s'ouvre dans un passage:
Cet article soutient que la programmation fonctionnelle paresseuse rend non seulement inutile le mécanisme de gestion des exceptions intégré, mais fournit un outil puissant pour développer et transformer des programmes qui utilisent des exceptions
(Une théorie fonctionnelle des exceptions, Mike Spivey, 1988)
Mais je pense que les exceptions sont bonnes. Je ne veux pas transformer les programmes qui utilisent des exceptions, au contraire, je veux rendre l'utilisation des exceptions moins chaotique.
La question:
Existe-t-il une théorie des exceptions? Si oui, comment s'appelle-t-il? Quelles sont, le cas échéant, la pierre angulaire décrivant la base de celui-ci?
LookupError
serait parfaitement bien pour chaque conteneur personnalisé, mais beaucoup de gens ne savent même pas qu'il existe.Réponses:
Il existe un grand nombre de publications sur les exceptions, avec pas mal de recherches théoriques. Voici une liste non structurée et loin d'être complète avec quelques exemples. Désolé, je n'ai pas le temps pour le moment pour une réponse plus ciblée.
la source
Je ne sais pas s'il existe ou non une théorie, mais il peut y avoir une science expérimentale pragmatique émergente.
La meilleure source à laquelle je peux penser est Bjarne Stroustrup, The Design and Evolution of C ++, Addison-Wesley, 1994 . Si je me souviens bien (c'est un très bon livre et les gens continuent de me l'emprunter et de ne pas le retourner, donc je n'ai pas de copie pour le moment), il y a un chapitre sur les exceptions. Le comité C ++ de Stroustrup avait besoin de beaucoup de preuves empiriques qu'une fonctionnalité proposée était nécessaire avant de vouloir l'ajouter à la définition du langage. La page Wikipedia sur les exceptions a la citation suivante de ce livre:
En C ++, le véritable gain est RAII , ce qui facilite beaucoup la gestion de la désallocation des ressources lors d'erreurs. (Cela ne supprime pas le besoin de
throw
ettry
-catch
, mais cela signifie que vous n'en avez pas besoinfinally
.)Je pense que la chose qui les a convaincus qu'ils avaient besoin d'exceptions est les conteneurs génériques: l'auteur du conteneur ne sait rien des types d'erreurs que les objets contenus pourraient avoir besoin de renvoyer (encore moins comment les gérer), mais le code qui a inséré ces objets dans le le conteneur doit savoir quelque chose sur l'interface de ces objets. Mais comme nous ne savons rien des types d'erreurs que les objets contenus peuvent générer, nous ne pouvons pas standardiser les types d'exceptions. (Contrapositivement: si nous pouvions standardiser les types d'exceptions, nous n'aurions pas besoin d'exceptions.)
L'autre chose que les gens semblent avoir appris au fil des ans est que les spécifications d'exception sont difficiles à mettre correctement dans une langue. Voir par exemple ceci: http://www.gotw.ca/publications/mill22.htm , ou ceci: http://www.gotw.ca/gotw/082.htm . (Et ce n'est pas seulement C ++, les programmeurs Java ont également de longs arguments sur leurs expériences avec les exceptions vérifiées et non contrôlées .)
Un peu sur l'histoire des exceptions. L'article classique est: John B. Goodenough: "Traitement des exceptions: problèmes et proposition de notation", Commun. ACM 18 (12): 683-696, 1975. Mais des exceptions étaient connues avant cela. Mesa les avait vers 1974 et PL / I les avait peut-être aussi. Ada avait un mécanisme d'exception avant 1980. Je crois que les exceptions de C ++ ont été le plus influencées par l'expérience avec le langage de programmation CLU de Barbara Liskov vers 1976. Barbara Liskov: "A history of CLU", in History of programming languages --- II , Thomas J. Bergin, Jr. et Richard G. Gibson, Jr. (éd.). pp. 471-510, ACM, 1996 .
la source
serious-condition
vssimple-condition
. Je lis également maintenant JL Austing, où il classe les erreurs (sans rapport avec la programmation) en groupes en fonction de la façon dont le système n'a pas réussi à exécuter la tâche (par exemple, pièces incorrectes utilisées vs intentions non sincères). Ce qui n'est pas immédiatement applicable à la programmation, mais pourrait l'être après un certain raffinement.very strong objection
contre-exceptions en C ++ proviennent de deux faits: il n'y a pas definally
construction et personne d'autre n'utilise d'exceptions. Le premier problème aggrave également le second. Autrement dit, lorsque vous n'avez pasfinally
, vous ne pouvez pas fermer la ressource lorsque survient une exception. Parce que personne n'utilise d'exceptions, toutes les fonctions / API les évitent, vous devez investir beaucoup pour reconstruire toute l'infrastructure C ++ traditionnelle en enveloppant toutes les fonctions avec vos exceptions pour commencer à en tirer des avantages dans votre code. Mais le manque definally
rend cette approche impossible également.Permettez-moi de souligner que les exceptions sont un cas d' effet de calcul . Les autres effets de calcul sont l'état mutable, les E / S, le non-déterminisme, les continuations et bien d'autres. Ainsi, votre question pourrait être posée de manière plus générale: comment former des hiérarchies d'effets de calcul, comment les organiser et pourquoi avons-nous ceux que nous avons, et pas d'autres, etc.
la source