43 votes

Pourquoi les blocs try..catch nécessitent-ils des accolades ?

Alors que dans d'autres instructions comme if ... else, vous pouvez éviter les accolades s'il n'y a qu'une seule instruction dans un bloc, vous ne pouvez pas le faire avec les blocs try ... catch : le compilateur ne le croit pas. Par exemple :

try
    do_something_risky();
catch (...)
    std::cerr << "Blast!" << std::endl;

Avec le code ci-dessus, g++ dit simplement qu'il attend un '{' avant do_something_risky(). Pourquoi cette différence de comportement entre try ... catch et, disons, if ... else ?

Merci !

13voto

Justin Niessner Points 144953

Tout droit sorti de la spécification C++ :

try-block:
    try compound-statement handler-seq

Comme vous pouvez le voir, toutes les try-block s attendent à un compound-statement . Par définition, une instruction composée est constituée de plusieurs instructions entourées d'accolades.

Le fait de tout avoir dans une déclaration composée garantit qu'une nouvelle portée est générée pour le bloc d'essai. À mon avis, cela rend également le tout légèrement plus facile à lire.

Vous pouvez le vérifier vous-même à la page 359 de l'ouvrage Spécification du langage C++

10voto

R Samuel Klatchko Points 44549

Je ne sais pas trop pourquoi, mais l'un des avantages est qu'il n'y a pas de problème d'accrochage. Voir dangling-else pour une ambiguïté qui peut survenir lorsque les accolades sont facultatives.

6voto

vpit3833 Points 4435

Lire ce lien . La plupart des raisons semblent concerner la gestion de la portée et de l'allocation des objets qui doivent être créés et détruits en cas d'exceptions réelles.

Je pense donc que les auteurs de la grammaire du C++ demandent aux auteurs de g++ (ou de tout compilateur C++ conforme aux normes) de le préparer aux pires cas possibles, et les auteurs de g++ semblent l'avoir fait.

3voto

Paul Nathan Points 22910

D'abord, c'est comme ça que la grammaire fonctionne.

Deuxièmement, je pense que le but est de générer de force une nouvelle portée pour les blocs d'exception (corrigez-moi si je me trompe).

1voto

INS Points 5679

C'est ainsi que ils voulait être. Il n'y a pas de justification, c'est une loi.

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