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:
Lors de la réunion de Palo Alto [normalisation C ++] en novembre 1991, nous avons entendu un brillant résumé des arguments pour une sémantique de terminaison appuyée à la fois par une expérience personnelle et des données de Jim Mitchell (de Sun, anciennement de Xerox PARC). Jim avait utilisé la gestion des exceptions dans une demi-douzaine de langues sur une période de 20 ans et était l'un des premiers partisans de la sémantique de reprise en tant que l'un des principaux concepteurs et réalisateurs du système Cedar / Mesa de Xerox. Son message était la résiliation est préférable à la reprise; ce n'est pas une question d'opinion mais une question d'années d'expérience. La reprise est séduisante, mais non valable. Il a soutenu cette déclaration avec l'expérience de plusieurs systèmes d'exploitation. L'exemple clé était Cedar / Mesa: il a été écrit par des gens qui aimaient et utilisaient la reprise, mais après dix ans d'utilisation, il n'y avait plus qu'une seule utilisation de la reprise dans le système d'un demi-million de lignes - et c'était une enquête contextuelle. Comme la reprise n'était pas réellement nécessaire pour une telle enquête contextuelle, ils l'ont supprimée et ont constaté une augmentation significative de la vitesse dans cette partie du système. Dans tous les cas où la reprise avait été utilisée, elle était devenue - au cours des dix dernières années - un problème et une conception plus appropriée l'avait remplacée. Fondamentalement, chaque utilisation de la reprise avait représenté un échec à maintenir des niveaux séparés d'abstraction disjoints. Dans tous les cas où la reprise avait été utilisée, elle était devenue - au cours des dix dernières années - un problème et une conception plus appropriée l'avait remplacée. Fondamentalement, chaque utilisation de la reprise avait représenté un échec à maintenir des niveaux séparés d'abstraction disjoints. Dans tous les cas où la reprise avait été utilisée, elle était devenue - au cours des dix dernières années - un problème et une conception plus appropriée l'avait remplacée. Fondamentalement, chaque utilisation de la reprise avait représenté un échec à maintenir des niveaux séparés d'abstraction disjoints.
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
et try
- catch
, mais cela signifie que vous n'en avez pas besoin finally
.)
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 .