(A faire en dehors du TD)
En C# (et aussi en java), vous avez la possibilité d’écrire un bloc finally.
try { … } finally { // Ce code est toujours exécuté // Qu’une exception se produise // Que cette exception soit capturée // Que cette exception ne soit pas capturée // Qu’une exception soit générée dans le traitement // de l’exception. // Qu’aucune exception ne se produise. }
Le code qui se trouve dans le bloc du finally est toujours exécuté, qu’une exception se produise ou qu’aucune exception ne se produise.
En C++, cette construction n’existe pas. Est-ce qu’il est possible de garantir la même chose en C++ en utilisant des blocs catch ?
try { … } catch(type1 e) { // Capture les exceptions dérivant de type1 } catch(type1 e) { // Capture les exceptions dérivant de type2 si elles n’ont pas été capturées // par les exceptions de type1. } catch(…) { // Capture toutes les exceptions n’ayant pas été capturées par une clause // précédente }
Nous souhaitons que la fonction divide
définie à la question précédente affiche le message « fonction terminée » à la fin de la fonction et même si une exception a été levée.
Comment faire avec la solution proposée à la question précédente ?
Quel est le défaut de cette approche ?
Nous suggérons de contourner la difficulté en utilisant un objet. Nous savons qu’un objet alloué sur la pile est systématiquement détruit lorsqu’il sort du bloc d’activation. Lorsqu’un objet est détruit, son destructeur est appelé.
Remarque : Dans le destructeur, il est possible de faire exécuter le code qui aurait été mis dans le bloc finally de C# ou de JAVA et que nous souhaitons systématiquement voir exécuté. Compléter la classe suivante pour qu’elle affiche le message « fonction terminée » lorsque l’objet est détruit.
class finally { public : finally(){} ~finally() {…} … }
Mettez en œuvre cette solution en lieu et place de la solution proposée à la question 1.2.
Vérifiez que cette solution fonctionne correctement.