© D. Mathieu
mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 16/01/2000 -
Dernière mise à jour : 25/01/2001
Remarques préliminaires :
Exception entière
|
exo_01 | ||||||||
Sortie de boucle par une exception | exo_02 | ||||||||
Capture d'exception avec/sans conversion ? | exo_03 | ||||||||
Mode de passage de l'exception au bloc catch
|
exo_04 | ||||||||
Exceptions standard | exo_05 | ||||||||
Exceptions utilisateur | exo_06 |
Dans la fonction Exo_01() de l'espace de noms anonyme du fichier exo_01a.cxx, initialiser une variable (ou une constante) entière non nulle Num, et lire au clavier le dénominateur Denom, lui aussi entier. Tester le dénominateur (schéma alternatif) :
Sécuriser l'ensemble du corps de la fonction Exo_01a() en l'incluant dans une instruction try-catch. Dans le traitant de l'exception capturée, afficher la valeur de l'exception dans le flux d'erreur.
Compiler et tester.
Corrigés : exo_01a.cxx
Recopier le fichier exo_01a.cxx dans exo_01b.cxx. Dans la fonction Exo_01(), modifier le traitant d'exception pour qu'il relève l'exception après l'affichage.
Modifier le corps de la fonction main() pour permettre la capture de toute exception, quelle qu'elle soit.
Dans le traitant correspondant, l'exception ne pouvant être identifiée, afficher le message :
Exception inconnue reçue dans la fonction main() |
et renvoyer la constante entière (short) CstExcInconnue (= 255).
Compiler et tester.
Vérifier que le c-shell a bien reçu la valeur renvoyée par la fonction main() :
duo>echo $status |
Corrigés : exo_01b.cxx
Recopier le fichier exo_01b.cxx dans exo_02.cxx. Dans la fonction Exo_02(), initialiser une constante entière non nulle Num, et, dans une boucle infinie, lire au clavier le dénominateur Denom, lui aussi entier. Ne sortir de la boucle, en levant une exception entière, comme ci-dessus, que si Denom est positif. Il faudra bien entendu utiliser un bloc try-catch, même si le traitant d'exception est vide. Afficher le résultat de la division entière avant de retourner de la fonction Exo_02().
Compiler et tester.
Remarques :
if (Denom > 0) break; |
Corrigés : exo_02.cxx
Dans la fonction Exo_03(), lever une exception de type unsigned int dans un bloc try-catch. Ecrire un traitant d'exception de type unsigned int qui affiche l'exception reçue.
Tester.
Après le traitant ci-dessus, ajouter un traitant d'exception de type int qui affiche l'exception reçue.
Tester. Quel est le traitant qui est exécuté ?
Intervertir les deux traitants d'exceptions.
Tester. Quel est le traitant qui est exécuté ?
Mettre en commentaire le traitant d'exception de type unsigned int.
Tester. L'exception levée (qui est de type unsigned int) est-elle convertie en entier int ?
Corrigés : exo_03.cxx
Compiler. Vous ne devriez aller guère plus loin ...
Corrigés : exo_04a.cxx
Compiler et tester. Vous devez constater que la modification interne de l'exception n'a pas affecté l'exception qui est en cours de traitement et qui est relevée telle qu'elle a été interceptée.
Corrigés : exo_04b.cxx
Compiler et tester. Vous constatez que l'exception relevée n'est pas celle qui a été capturée, mais sa copie locale et modifiée.
Corrigés : exo_04c.cxx
Compiler et tester. Vous constatez que l'exception relevée, qui est celle qui a été capturée, a été modifiée au sein du traitant d'exception interne.
Corrigés : exo_04d.cxx
La norme C++ a prévu un certain nombre d'exceptions standard correspondant à plusieurs circonstantes différentes. Malheureusement, la plupart ne sont pas implémentées dans la version du compilateur que nous utilisons actuellement. Nous pouvons cependant en mettre quelques-unes en évidence.
Dans la fonction Exo_05(), construire et initialiser une chaîne string. Dans un bloc try-catch, essayer d'insérer un caractère dans une position invalide. En principe, l'exception out_of_range devrait être attendue. Par prudence, ajouter aussi un traitant d'exception pour les exceptions de la classe standard exception. Compiler et tester.
Ajouter un second bloc try-catch. Essayer d'accéder à un élément d'indice invalide par l'opérateur []. L'exception out_of_range est-elle levée ?
Remplacer l'opérateur [] par la fonction at(). L'exception out_of_range est-elle levée ?
Corrigés : exo_05.cxx
Compiler et tester.
Ajouter à l'espace de noms anonyme (avant la fonction Exo_06()) la classe CExc par dérivation publique de exception. Faire précéder la levée de l'exception exception par la levée d'une exception CExc. Capturer cette exception et afficher son contenu (toujours par la fonction héritée what()).
Compiler et tester.
Corrigés : exo_06.cxx
© D. Mathieu
mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique