C ++: le mécanisme d'exception

La prochaine fois que vous examinez un exemple C ++ de code, jetez un oeil de plus près les mesures que le code passe par à gérer une exception. Lorsque le jet se produit, premiers exemplaires de l'objet C jetés dans un endroit neutre. Il commence alors à la recherche de la fin du courant essayer bloc.

Si un essayer bloc ne se trouve pas dans la fonction en cours, la commande passe à la fonction appelante. Une recherche est alors faite de cette fonction. Sinon essayer bloc se trouve là-bas, le contrôle passe à la fonction qui l'a appelé, et ainsi de suite jusqu'à la pile de l'appel de fonctions. Ce processus est appelé le déroulement de la pile.

Une caractéristique importante de la pile déroulement est que chaque pile est déroulée, les objets qui sortent de la portée sont détruites comme si la fonction avait exécuté un retour déclaration. Cela permet de maintenir le programme de la perte de biens ou de laisser des objets ballants.

Lorsque le coffrage essayer bloc est trouvé, le code des recherches sur la première capture membre de phrase suivant immédiatement l'accolade fermante de la capture bloc. Si l'objet lancé correspond au type d'argument spécifié dans le capture déclaration, le contrôle passe à celui capture phrase.

Dans le cas contraire, un contrôle est effectué de la prochaine capture phrase. Si aucune correspondance capture phrases sont trouvés, les recherches de code pour le niveau supérieur essayer bloquer dans une spirale toujours vers l'extérieur jusqu'à une appropriée capture peut être trouvé. Sinon capture la phrase est trouvé, le programme est terminé.

Prenons l'exemple suivant:

// CascadingException - le programme suivant montre un exemple de // pile déroulement # include #comprendre #comprendre using namespace std - // prototypes de certaines fonctions que nous aurons besoin f1 latervoid () - f2 void () - f3 void () - classe Obj {public: Obj (char c): label (c) {cout lt; lt; "Construire objet" lt; lt; étiquette lt; lt; endl-} ~ Obj () {cout lt; lt; "Détruire des objets" lt; lt; étiquette lt; lt; endl-} protégée: étiquette char -} - int main (int nNumberofArgs, char * pszArgs []) {f1 () - // attendre utilisateur est prêt avant de terminer le programme // pour permettre à l'utilisateur de voir le resultscout de programme lt; lt; "Appuyez sur Entrée pour continuer ..." lt; lt; endl-cin.ignore (10, ' n') - cin.get () - retourner 0-} f1 void () {Obj un ('a') - try {Obj b ('b') - f2 () -} catch (float f) {cout lt; lt; "Prises de Float" lt; lt; endl-} catch (int i) {cout lt; lt; «Attraper Int" lt; lt; endl-} catch (...) {cout lt; lt; chaîne ("catch générique") lt; lt; endl -}} f2 void () {try {Obj c ('c') - f3 () -} catch (string msg) {cout lt; lt; «Attraper String" lt; lt; endl - f3}} void () {obj d ('D') - touche 10}

La sortie de l'exécution de ce programme se présente comme suit:

Construire objet aConstructing objet bConstructing objet objet cConstructing objet dDestructing dDestructing objet objet objet cDestructing Bint catchDestructing aAppuyez Entrée pour continuer ...

D'abord, vous voyez les quatre objets a, b, c, et étant réalisé sous la forme main () appels f1 () qui appelle f2 () qui appelle f3 (). Plutôt que de retour, cependant, f3 () jette l'entier 10. Parce que personne ne essayer bloc est définie en f3 (), C ++ dénouements f3 () # 8242-s pile, objet causant être détruite.

La fonction suivante de la chaîne, f2 () définit un essayer bloc, mais son seul capture la phrase est conçu pour gérer un chaîne, qui doesn # 8242-t match, le int jetés. Par conséquent, C ++ continue la recherche. Cette déroule f2 () # 8242-s pile, résultant dans l'objet c étant détruite.

Retour à f1 (), C ++ trouve une autre essayer bloc. Quitter que les causes de bloc objet b pour aller hors de portée. C ++ saute le premier capture phrase pour une flotteur. Le prochain capture phrase correspond à la int exactement, si C ++ passe le contrôle à cette expression.

La commande passe à partir de la catch (int) phrase à l'accolade fermante de la finale capture expression et de là retour à main (). Le final catch (...) phrase, qui serait attraper un objet jeté, est ignorée car une correspondance capture phrase a déjà été trouvé.


» » » » C ++: le mécanisme d'exception