Spécifications des exceptions (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gestion des exceptions C++ standard

Vous pouvez spécifier les exceptions qu'une fonction peut déclencher. Le déclenchement d'une exception de type incorrect après une fonction constitue une erreur d'exécution. La syntaxe d'une spécification d'exception est la suivante :

exception-specification:

throw (type-id-list) // type-id-list is optional
type-id-list:

type-id
type-id-list, type-id

Voici des exemples de fonctions avec des spécifications d'exceptions.

 void f1(); // The function can throw any exception
 void f2() throw(); // Should not throw any exceptions
 void f3() throw(A, B*); // Can throw exceptions publicly derived from A, or a pointer to publicly derived B

La définition et toutes les déclarations d'une telle fonction doivent comporter une spécification d'exception contenant le même ensemble de type-ids. Si une fonction déclenche une exception non listée dans sa spécification, le programme appelle la fonction unexpected.

Vous n'avez pas besoin de spécifier une exception pour les raisons suivantes :

  • Premièrement, la spécification d'exception pour une fonction a des effets sur les performances d'exécution de Windows.
  • Deuxièmement, des erreurs inattendues peuvent survenir à l'exécution. Par exemple, supposons que votre système utilise des spécifications d'exceptions et un autre sous-système dans son implémentation. Supposons maintenant que le sous-système est modifié pour pouvoir déclencher de nouveaux types d'exceptions. Quand vous utilisez le nouveau code du sous-système, vous pouvez obtenir des erreurs d'exécution sans jamais avoir d'indication de ces erreurs de la part du compilateur.
  • Troisièmement, si vous utilisez des fonctions virtuelles, vous pouvez violer la conception du programme. En effet, la spécification d'exception n'est pas considérée comme faisant partie du type de la fonction. Par exemple, dans le code suivant, la classe dérivée BETA::vfunc est définie de telle sorte qu'elle ne déclenche aucune exception — une entorse à la déclaration de fonction originale.
 class ALPHA {
 public:
 	struct ALPHA_ERR {
 	};
 
 	virtual void vfunc(void) throw(ALPHA_ERR) {
 	} // Exception specification
 };
 
 class BETA : public ALPHA {
 	void vfunc(void) throw() {
 	} // Exception specification is changed
 };

Voir aussi