2009-03-04 6 views
11

Quel est l'avantage de déclarer les exceptions-throw possibles à partir d'une fonction C++? En d'autres termes, que fait le mot-clé throw()?Quel est l'avantage de limiter les lancements autorisés par une fonction C++?

J'ai lu qu'une déclaration de fonction telle que void do_something() throw(); devrait garantir qu'aucune exception ne provient de la fonction do_something(); Cependant, cela ne semble pas être vrai pour les fonctions appelées do_something(), ce qui en fait une garantie faible.

Veuillez décrire l'utilité (et les meilleurs exemples) de cette fonctionnalité linguistique.

Répondre

0

En fait, en déclarant la fonction avec throw(); vous dire au compilateur que vous cent pour cent certain que la fonction est pas va lancer des exceptions, ce qui permet au compilateur d'effectuer certaines optimisations. Si votre fonction déclenche une exception de toute façon, vous avez des problèmes, car il en résulte probablement un comportement indéfini.

+2

bien- comportement défini, en fait: il appelle inattendu(). Comportement mal implémenté, oui, mais bien défini. – MSalters

5

La norme C++ requiert que la fonction unexpected() soit appelée si une fonction tente de lancer une exception qui ne figure pas dans sa liste d'exceptions. Une courte description de cela à partir de MSDN est ici: http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

La plupart des compilateurs ne prennent pas en charge cette fonctionnalité C++.

+1

>> La plupart des compilateurs ne supportent pas réellement cette fonctionnalité C++ << - et pour un exemple, voir la page de documentation de MSVC que vous avez pointée ... –

1
void do_something() throw(); 

Ceci est une garantie du côté de l'implémenteur que la fonction ne lèvera jamais une exception. C'est ce qu'un client de la fonction peut attendre. Cependant, cela signifie également que toute exception générée quelque part à l'intérieur de la fonction est traitée et non renvoyée au parent de do_something(). Honte à celui qui rentre de l'intérieur, car il n'y a rien qui l'empêchera de lancer. En effet, lancer à partir d'une fonction avec une spécification d'exception vide équivaut à lancer une exception non mentionnée dans la spécification et faire en sorte que le std::unexpected() soit attendu, suivi de la fin du programme.

BTW: La définition généralement acceptée de la garantie d'exception forte est la suivante: Si une opération publique échoue pour une raison quelconque, une exception est levée et l'état de l'objet reste inchangé (opération atomique).

Questions connexes