2013-07-16 1 views
2

Nous sommes dans notre 4ème et dernière classe C++, j'ai regardé la publication de Herb Sutter sur la spécification d'exception et quelques messages sur stackoverflow indiquant que les spécifications d'exception seront déconseillées dans la prochaine version de C++.spécification d'exception vs gestion des exceptions

Je peux trouver des exemples de la façon d'implémenter des spécifications d'exception, mais j'ai quelques problèmes de compréhension, je veux juste savoir quelles sont les spécifications d'exception et comment elles diffèrent de la gestion des exceptions.

Toute aide apportant un éclairage sera très utile.

+1

Ils ont été dépréciés dans la dernière version de C++ (il y a près de deux ans). –

+0

Il existe deux types de spécification d'exception, les spécifications d'exception dynamique et les spécifications noexcept. Seules les spécifications d'exceptions dynamiques sont obsolètes –

+0

L'une des raisons pour lesquelles cette fonctionnalité était obsolète, car les utilisateurs ne pouvaient pas faire les choses correctement. – SChepurin

Répondre

5

Les spécifications d'exception demandent au compilateur de gérer tous les types d'exception non répertoriés en appelant std::unexpected() ou l'ensemble de remplacement avec std::set_unexpected().

Ils sont universellement considérés comme une mauvaise chose.

: idées fausses communes

  • « Le compilateur vérifiera si vous faites tout ce qui pourrait lancer des exceptions. » Faux. Les exceptions C++ ne sont pas vérifiées lors de la compilation. Le compilateur ne vérifie pas si vous lancez d'autres types, et il ne vérifie pas si vous oubliez de gérer les types d'exception non listés.
  • "Vous ne pouvez pas lancer d'exceptions d'autres types." Faux, dans la fonction, toute exception peut être levée. Lors de l'exécution, si la fonction se termine anormalement via un type d'exception non répertorié, le gestionnaire inattendu est appelé, ce qui permet de remplacer l'exception par un type répertorié.

Voir également std::bad_exception.

+1

Ben, qu'est-ce que cela signifie vraiment et pourquoi le message de @Crazy Eddie est-il incorrect? –

+0

@Joe: Parce que cela ne vous empêche pas de lancer des exceptions d'autres types ... cela change complètement la manipulation. –

+0

Jamais dit que vous ne pouviez pas jeter des exceptions d'autres types. –

3

Les spécifications d'exception spécifient les exceptions qu'une fonction peut déclencher.

+0

Non, pas vraiment. Même si je comprends pourquoi tu penses ça. –

+3

Plus précisément: Une spécification d'exception vous indique quels types d'exceptions peuvent s'échapper d'une fonction. – Casey

+0

C'est toujours une réponse correcte (et très courte), cependant. Oui, vous pouvez violer ce "contrat", mais cela n'a pas vraiment d'importance. Vous pouvez également casser d'autres contrats (constness ou protection). Celui-ci ajoute seulement un gestionnaire d'exécution explicite pour cela, ce qui n'est généralement pas le cas lorsque vous faites autre chose que ce que vous avez promis. – Damon

1

Les spécifications d'exception, comme son nom l'indique, concernent la spécification des exceptions qu'une fonction peut lancer; en général. Comment le peut est appliqué mais dépend de la langue.

  • en Java le compilateur applique statiquement et rejettera le programme si jamais votre fonction peut jeter quelque chose d'autre (à moins que quelque chose dérive d'autre d'une base de classe d'exception spécifique)
  • en C++, le compilateur permet au programme , mais il insère un contrôle d'exécution et si jamais quelque chose est jeté qui n'a pas été spécifié, il appelle std::unexpected

en général, les spécifications exceptions sont à peu près universellement décrié parce que:

  • ils ne se composent pas bien. Si vous appelez deux fonctions lançant chacune un ensemble X et Y d'exceptions, alors la fonction résultante devrait au moins déclarer l'union de X et Y. Comme il devient rapidement ingérable, vous devez alors "traduire" les exceptions en un type commun , enveloppant l'original pour garder le contexte. Il n'est pas inhabituel de se retrouver avec une chaîne de 3 ou 5 exceptions profondes.
  • certaines opérations de base peuvent être lancées. En C++, l'allocation de mémoire peut lancer std::bad_alloc; à peu près toutes les collections STL sont donc sensibles par exemple.

Si possible, oubliez que vous avez déjà pris connaissance des spécifications d'exception.