La gestion des exceptions nécessite-t-elle une programmation orientée object?

À ce stade de mon expérience de programmation, je me rends compte à quel point je suis gêné par la gestion des exceptions dans la plupart des langues utilisées aujourd’hui (C ++, .Net, Java, etc.), du moins par rapport à C. cours de C avancé et je pense vraiment à ces termes par rapport à mon paradigme actuel.

En C, c’est au programmeur de prévenir les erreurs, ce qui est décourageant pour quiconque est habitué à la gestion des exceptions. Il m’est apparu que tout langage que je rencontrais et qui traitait des exceptions se trouvait orienté object. Le premier langage orienté object à avoir une gestion des exceptions, du moins à ma connaissance, est C ++, qui est en quelque sorte une évolution de C. (corrigez-moi si je me trompe)

Cela dit, y a-t-il quelque chose dans la nature orientée object d’un langage qui permet la gestion des exceptions, ou la gestion des exceptions a-t-elle été ajoutée en tant que caractéristique des langages orientés object devenant un lieu commun? Qu’est-ce que C manque de ça pour dire, C ++, dans le code machine qui fait fonctionner les excipétés?

J’ai trouvé cet article sur la façon dont la gestion des exceptions fonctionne sous le capot, mais je ne suis pas sûr de savoir comment cette information s’applique à ma question (par exemple, C manque-t-il de notifications, de continuations, etc.? ). Merci d’avance.

C ne contient rien dans le code machine, et la gestion des exceptions était et est courante dans C avec setjmp et longjmp .

La raison de l’absence totale d’une fonctionnalité de niveau langue dans les langages purement procéduraux est que la gestion des exceptions est identique à setjmp lorsqu’aucun destructeur n’a besoin d’être appelé. La gestion des exceptions existait auparavant dans les langages exotiques, mais elle n’a jamais été prise en compte parce que c’était du sucre purement syntaxique. Cependant, une fois que les destructeurs sont entrés en scène et que le déroulement de la stack est devenu nécessaire, la prise en charge au niveau de la langue est devenue nécessaire et la gestion des exceptions a été largement implémentée dans le langage.

La gestion des exceptions nécessite-t-elle une programmation orientée object?

Non, les deux sont complètement séparés. On peut avoir des langages OO qui n’ont pas la gestion des exceptions comme une primitive de stream de contrôle, et on peut avoir la gestion des exceptions dans les langues non-OO.

Comme le souligne utilement Wikipedia, la programmation orientée object est un style de programmation qui met l’accent sur l’ abstraction , l’ encapsulation , la messagerie , la modularité , le polymorphism et l’ inheritance afin de réutiliser le code à faible coût et de gérer efficacement les logiciels complexes. projets mis en œuvre par de grandes équipes.

Vous ne voyez pas “loops” ou “if instructions” ou “goto” ou “try-catch-finally-throw” dans cette liste car les primitives de stream de contrôle n’ont rien à voir avec l’abstraction, l’encapsulation, la messagerie, la modularité ou le polymorphism. l’inheritance étant utilisé pour obtenir une réutilisation de code à faible coût ou une gestion efficace de projets logiciels complexes par de grandes équipes.

Qu’est-ce que C manque de dire, C ++, dans le code machine qui fait fonctionner les exceptions?

Il est certain que le matériel moderne est conçu avec la gestion des exceptions comme une primitive de stream de contrôle. C a été conçu bien avant l’existence du matériel moderne, ce qui rendrait un peu plus difficile l’implémentation de la gestion des exceptions dans C, qui s’exécute efficacement sur tout le matériel sur lequel C est exécuté.

Mais cela dit, rien ne vous empêche, vous ou quiconque, de concevoir une nouvelle version de C qui gère les exceptions en tant que primitive de stream de contrôle, mais sans toutes les autres fonctionnalités de C ++.

Si vous êtes intéressé par la question de savoir comment append la gestion des exceptions aux langages non OO qui prennent en charge les continuations, consultez mon article sur le sujet qui décrit l’idée:

http://blogs.msdn.com/b/ericlippert/archive/2010/10/22/continuation-passing-style-revisited-part-two-handwaving-about-control-flow.aspx

Cela dit, y a-t-il quelque chose dans la nature orientée object d’un langage qui permet la gestion des exceptions, ou la gestion des exceptions a-t-elle été ajoutée en tant que caractéristique des langages orientés object devenant un lieu commun?

J’ai d’abord appris à connaître les exceptions quand j’ai dû apprendre Ada (étudier le CS) au début des années 90. IIRC, Ada avait un type spécial Exception . C’était, à l’époque, pas un langage orienté object. (Ada95 a ajouté des concepts OO.) Cependant, je suis d’accord que le déroulement de la stack (c’est-à-dire le nettoyage automatique complet des ressources allouées) est un trait important pour le succès de la gestion des exceptions. La combinaison de destructeurs avec la gestion des exceptions est un point important pour le succès des exceptions en C ++.

Je pense aussi que Stroustrup mentionne Ada comme une influence majeure pour la gestion des exceptions en C ++.

La gestion des exceptions nécessite-t-elle une programmation orientée object?

Les deux sont orthogonaux. D’autres ont mentionné setjmp et longjmp utilisés dans C pour gérer les erreurs. Je veux mentionner SEH.

SEH (gestion des exceptions structurées) est une extension microsoft vers C avec un support de niveau OS. Il vous permet d’écrire du code comme ( exemple de MSDN ):

 __try { *pResult = dividend / divisor; } __except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { // handle exception } 

Vous pouvez également lever vos propres exceptions en appelant RaiseException . Contrairement à setjmp et longjmp vous pouvez effectuer votre propre nettoyage dans les blocs __finally . En fait, les exceptions C ++ sont implémentées au-dessus de SEH (sur Windows).

Ceci est un exemple de gestion des exceptions de manière totalement non orientée object.

Un autre exemple en C ++ qui n’utilise aucune fonctionnalité orientée object:

 try { throw "Boom!"; } catch(const char* str) { printf("Error: %s\n", str); }