40 votes

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

A ce point de mon expérience de la programmation, je réalise à quel embarras je suis de la gestion des exceptions disponible dans la plupart des langues utilisées aujourd'hui (C++, .Net, Java, etc), au moins en comparaison avec C. je suis prêt à prendre une avancée C cours et a me fait vraiment penser que ces termes, par rapport à mon paradigme actuel.

En C, c'est au programmeur pour éviter les erreurs de prédiction, en premier lieu, ce qui est assez intimidant pour quelqu'un qui est utilisé pour le traitement d'exception. Il a eu lieu pour moi que n'importe quelle langue que j'ai rencontré qui a la gestion des exceptions arrive à être orientée objet. Le premier langage orienté objet à l'exception de la manutention, du moins à ma connaissance, est le C++, qui est en quelque sorte une évolution de C. (corrigez-moi si je me trompe)

Cela étant dit, il ya quelque chose à propos de l'orienté-objet, la nature de la langue, qui permet la gestion des exceptions, ou a la gestion des exceptions ajouté une fonctionnalité que les langages orientés objets vraiment commencé à devenir un lieu commun? Qu'est ce que C n'est pas à dire, C++, en code machine qui fait excpetion de travail?

J'ai trouvé ce post sur la façon d'exception de la manipulation fonctionne sous le capot, mais pas sûr de la façon dont cette information s'applique à ma question (c'est à dire, est-ce que C le manque de notifications, les continuations, etc?). Merci à l'avance.

20voto

thiton Points 21303

C manque de rien en code machine, et la gestion des exceptions a été et est monnaie courante en C avec setjmp et longjmp.

La raison de l'absence totale de langue de niveau de fonctionnalité purement procédurale langues, c'est que la gestion des exceptions est identique à setjmp quand les pas les destructeurs ont besoin d'être appelé. La gestion des exceptions a été dans le passé dans des langues exotiques, mais n'a jamais pris parce que c'était purement de sucre syntaxique. Cependant, une fois que les destructeurs d'entrer en scène et le déroulement de pile est devenu nécessaire, de la langue-support de niveau est devenu nécessaire et la gestion des exceptions a été largement mis en œuvre dans le cadre de la langue.

15voto

Eric Lippert Points 300275

N'gestion des exceptions nécessitent de la programmation orientée objet?

Pas de. Les deux sont complètement séparées. On peut avoir OO langues qui n'ont pas la gestion des exceptions comme un flux de contrôle primitif, et on peut avoir la gestion des exceptions dans les non-OO langues.

La programmation orientée objet, comme Wikipédia en aidant à points, est un style de programmation qui met l'accent sur la valeur de l'abstraction, l'encapsulation, la messagerie, la modularité, le polymorphismeet l'héritage afin de réaliser à faible coût code de la ré-utilisation et la gestion efficaces des logiciels complexes projets mis en œuvre par de grandes équipes.

Vous ne voyez pas des "boucles" ou "if" ou "aller à" ou "try-catch-finally-jeter" sur cette liste, car le contrôle de flux de primitives n'ont rien à voir avec l'abstraction, encapsulation, de messagerie, de modularité, de polymorphisme ou d'héritage utilisées pour obtenir à faible coût de la réutilisation de code ou de gestion efficace de logiciels complexes projets de grandes équipes.

Qu'est ce que C n'est pas à dire, C++, en code machine qui fait des exceptions travail?

C'est certainement le cas que le matériel moderne est conçu avec la gestion des exceptions comme un flux de contrôle primitif à l'esprit. C a été conçu bien avant que le matériel moderne existe, ce qui permettrait de le rendre un peu plus difficile à mettre en œuvre la gestion des exceptions en C qui fonctionne efficacement sur tout le matériel que C s'exécute sur.

Mais cela dit, rien n'empêche que vous ou quelqu'un d'autre à partir de la conception d'une nouvelle version de C qui a la gestion des exceptions comme un flux de contrôle primitif, mais sans toutes les autres fonctionnalités de C++.

Si vous êtes intéressé par le sujet de la façon d'ajouter des exceptions pour les non-OO langages qui prennent en charge les suites, voir mon article sur le sujet qui esquisse l'idée:

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

10voto

sbi Points 100828

Cela étant dit, il ya quelque chose à propos de l'orienté-objet, la nature de la langue, qui permet la gestion des exceptions, ou a la gestion des exceptions ajouté une fonctionnalité que les langages orientés objets vraiment commencé à devenir un lieu commun?

J'ai d'abord appris à connaître des exceptions lorsque j'ai dû apprendre Ada (l'étude de CS) au début des années 90. IIRC, Ada avait un type spécial Exception. C'était, à l'époque, pas un langage orienté objet. (Ada95 ajouté quelques concepts OO.) Cependant, je suis d'accord que le déroulement de pile (c'est à dire la complète le nettoyage automatique de l'allocation de ressources) est un trait important pour le succès de la gestion des exceptions. En combinant les destructeurs avec la gestion des exceptions est un point important pour le succès des exceptions en C++.

J'ai aussi semblent se souvenir de Stroustrup de mentionner Ada comme une influence majeure pour la gestion des exceptions en C++.

7voto

ybungalobill Points 31467

N'gestion des exceptions nécessitent de la programmation orientée objet?

Pas de. Les deux sont orthogonaux. D'autres ont mentionné l' setjmp et longjmp utilisé en C pour gérer les erreurs. Je veux parler de la SEH.

SEH (structured exception handling) est une extension microsoft à C avec un niveau de l'OS de soutien. Il vous permet d'écrire du code (exemple à partir de MSDN):

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

Vous pouvez élever vos propres exceptions en appelant RaiseException. Contrairement aux setjmp et longjmp vous pouvez faire votre propre nettoyage en __finally blocs. En fait, les exceptions C++ sont mis en œuvre sur le dessus de la SEH (sur windows).

Ceci est un exemple de gestion d'exception dans un objet non-orienté de façon.

Un autre exemple en C++, qui n'utilise pas toutes les fonctionnalités orientées objet:

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

5voto

BRPocock Points 7904

Non-langages orientés objet que de mettre en œuvre la gestion des exceptions comprennent:

  • SON TECO
  • PL/1 (Multics)
  • C (comme plusieurs personnes l'ont souligné, par setjmp/longjmp)
  • C par le biais de signaux Unix: Unix noyau signaux sont dérivées de la Multics exception des installations de manutention
  • les anciennes versions de Lisp (certes, Common Lisp permet la programmation orientée objet, mais il n'a pas quand les conditions et redémarre ont été ajoutés) qui, apparemment, mise en œuvre des conditions et redémarre (unwind-protects) à partir de SON TECO - selon RMS (http://www.gsim.aoyama.ac.jp/~ida/GNU/RMStalk1207.html), ce qui implique que Lisp effectivement hérité de la gestion des exceptions par voie d'Emacs (chouette!)

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