Gestion des exceptions

Gestion des exceptions

Le mécanisme général

Depuis la version 3, C++ dispose d’un mécanisme dit de gestion des exceptions. Une exception est une rupture de séquence (pas un appel de fonction !) déclenchée (on dit aussi « levée ») par un programme à l’aide de l’instruction throw dans laquelle on mentionne une expression quelconque. Il y a alors branchement à un ensemble d’instructions, dit « gestionnaire d’exceptions », choisi en fonction de la nature de l’expression indiquée à throw. Pour qu’une portion de programme puisse intercepter une exception, il est nécessaire qu’elle figure à l’intérieur d’un bloc précédé du mot-clé try. Ce dernier soit être suivi d’une ou de plusieurs instructions catch représentant les différents gestionnaires correspondants, comme dans ce schéma : try { ….. // instructions susceptibles de lever une exception, soit // directement par throw (exp), soit par le biais de fonctions // appelées } exos_c++.book Page 275 Jeudi, 5. juillet 2007 11:10 11 Exercices en langage C++ 276 © Éditions Eyrolles catch (type_a …) { ….. // traitement de l’exception correspondant au type type_a } catch (type_b …) { ….. // traitement de l’exception correspondant au type type_b } ….. catch (type_n …) { ….. // traitement de l’exception correspondant au type type_n } Un gestionnaire d’exceptions peut contenir des instructions exit ou abort qui mettent fin à l’exécution du programme. Une instruction return fait sortir de la fonction ayant levé l’exception. Dans les autres cas (rarement utilisés), on passe aux instructions suivant le bloc try concerné.

Algorithme de choix d’un gestionnaire d’exceptions

Lorsqu’une exception est levée par throw, avec le type T, on recherche, dans cet ordre, un gestionnaire correspondant à l’un des types suivants : type T, type de base de T, pointeur sur une classe dérivée (si T est d’un type pointeur sur une classe), type indéterminé (indiqué par catch(…)) dans le gestionnaire.

Cheminement des exceptions

Lorsqu’une exception est levée par une fonction, on cherche tout d’abord un gestionnaire dans l’éventuel bloc try associé à cette fonction ; si l’on n’en trouve pas (ou si aucun bloc try n’est associé), on poursuit la recherche dans un éventuel bloc try associé à une fonction appelante et ainsi de suite. Si aucun gestionnaire d’exceptions n’est trouvé, on appelle la fonction terminate qui, par défaut appelle abort, laquelle fournit un message du genre abnormal program termination.

Spécification d’interface

Une fonction (y compris main) peut spécifier les exceptions qu’elle est susceptible de provoquer (elle-même, ou dans les fonctions qu’elle appelle à son tour). Elle le fait à l’aide du motclé throw, suivi, entre parenthèses, de la liste des exceptions concernées. Dans ce cas, toute exception non prévue et levée à l’intérieur de la fonction (ou d’une fonction appelée) entraîne l’appel d’une fonction particulière nommée unexpected. Par défaut, cette fonction appelle la fonction terminate. exos_c++.book Page 276 Jeudi, 5. juillet 2007 11:10 11 © Éditions Eyrolles 277 chapitre n° 19 Gestion des exceptions Exercice 135 a. Avec la valeur 1 : donnez un entier : 1 debut premier bloc try catch 1 – n = 1 // fourni par le bloc catch(int) associé au premier // bloc try suite programme Énoncé Quels résultats fournira ce programme lorsqu’on lui fournit comme données : a. la valeur 1þ? b. la valeur 0 ? #include using namespace std ; main() { int n ; cout << « donnez un entier :  » ; cin >> n ; try { cout << « debut premier bloc try\n » ; if (n) throw n ; cout << « fin premier bloc try\n » ; } catch (int n) { cout << « catch 1 – n =  » << n << « \n » ; } cout << « suite programme\n » ; try { cout << « debut second bloc try\n » ; throw n ; cout << « fin second bloc try\n » ; } catch (int n) { cout << « catch 2 – n =  » << n << « \n » ; } cout << « fin programme\n » ; } exos_c++.book Page 277 Jeudi, 5. juillet 2007 11:10 11 Exercices en langage C++ 278 © Éditions Eyrolles debut second bloc try catch 2 – n = 1 // fourni par le bloc catch(int) associé au second bloc // try fin programme On notera bien que, dans le premier bloc try, l’exception de type int provoque un branchement au bloc catch(int) correspondant. Comme ce dernier ne comporte pas d’instruction d’interruption de programme ou de fonction, on passe aux instructions suivant le dernier gestionnaire associé, c’est-à-dire ici au bloc try suivant. Là encore, une exception de type int provoque le branchement au bloc catch(int) correspondant (différent du précédent). Puis l’on passe aux instructions suivantes, c’est-à-dire ici à l’instruction affichant fin programme. b. Avec la valeur 0 : donnez un entier : 0 debut premier bloc try fin premier bloc try suite programme debut second bloc try catch 2 – n = 0 fin programme Ici, contrairement à ce qui se produisait dans l’exécution précédente, le premier bloc try ne déclenche plus d’exception. Son exécution se poursuit donc en entier, d’où le message fin premier bloc try. La suite est identique

Formation et coursTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *