Pouvez-vous vraiment avoir une fonction / méthode sans corps mais juste un bloc try / catch?

StackOverflow https://stackoverflow.com/questions/335839

  •  22-07-2019
  •  | 
  •  

Question

Notez que cette fonction n’a pas de " {" et "} " corps. Juste un bloc try / catch:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

Cela fait-il intentionnellement partie de C ++ ou s'agit-il d'une extension g ++?

Y a-t-il un autre objectif à cela que de contourner le niveau 1 de {}?

Je n'en avais jamais entendu parler avant de rencontrer http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

Était-ce utile?

La solution

Oui, c'est la norme. Les blocs d'essai de fonction, comme ils sont appelés, ne sont pas très utiles pour les fonctions habituelles, mais pour les constructeurs, ils permettent d'attraper les exceptions levées dans la liste des initialiseurs.

Notez que, dans le cas du constructeur, l'exception sera toujours réémise à la fin de tout bloc catch.

Autres conseils

Oui, c'est valide C ++. L’un des objectifs que j’ai trouvé est de traduire les exceptions en valeurs de retour et de faire en sorte que le code traduisant les exceptions en valeurs de retour soit séparé de l’autre code de la fonction. Oui, vous pouvez renvoyer x; à partir d'un bloc catch similaire à celui que vous avez montré (je ne l'ai découvert que récemment, en fait). Mais je voudrais probablement simplement utiliser un autre niveau d'accolades et mettre le try / catch à l'intérieur de la fonction dans ce cas. Il sera plus familier à la plupart des programmeurs C ++.

Un autre objectif consiste à intercepter les exceptions émises par une liste d'initialisation de constructeur, qui utilise une syntaxe similaire:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};

Herb Sutter a un bon article à ce sujet: http://www.gotw.ca/gotw /066.htm .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top