Correction
Dans le premier bloc try, l’appel du constructeur de A déclenche une exception de type Erreur_d. Celle-ci est traitée par l’unique gestionnaire relatif au type Erreur, ce qui est acceptable puisque Erreur_d dérive de Erreur.
Dans le second bloc try, la même exception est déclenchée, mais cette fois deux gestionnaires lui sont associés. Le premier gestionnaire trouvé qui convient est celui qui est exécuté, soit celui pour Erreur_d. En définitive, les résultats obtenus sont :
** exception Erreur 999
suite main
** exception Erreur_d 999 12
Notez que les messages apres creation a(1) et apres creation b(1) ne sont pas affichés puisque les deux blocs try sont interrompus avant d'arriver à ces instructions.
Que se passe-t-il si l’on inverse l’ordre des deux gestionnaires dans le second bloc try ?
Si l’on inverse l’ordre des deux gestionnaires dans le second bloc try, c'est-à-dire si le gestionnaire pour Erreur est placé avant celui pour Erreur_d, on obtient une erreur de compilation. En effet, le gestionnaire pour Erreur capturerait toutes les exceptions de type Erreur, y compris celles de type Erreur_d, rendant ainsi le second gestionnaire redondant et inatteignable. Par conséquent, le compilateur signale que le second gestionnaire ne peut jamais être atteint.