Cours informatique, tutoriel & guide de travaux pratiques en pdf.
Exceptions
Une exception est un évènement causé par une condition anormale demandant des mesures de traitement particulières. Parmi les exemples d’exceptions figurent les erreurs de traitement mathématiques (comme par exemple une division par zéro), les interruptions (signal généré par un périphérique pour annoncer un besoin de traitement par exemple, comme la pression d’une touche sur un clavier), les erreurs matérielles (erreur lors d’un accès disque, disque plein, etc…) et les erreurs logicielles.
Il n’existe pas de méthode typique de traitement des conditions exceptionnelles. Chaque domaine d’applications se doit de définir sa propre stratégie de traitement. Ainsi, dans un programme conventionnel, comme un éditeur de texte, un compilateur, un jeu ou autre, un traitement primitif suffira dans la majorité des cas. Ce traitement consistera par exemple en une terminaison « panique » du programme, où l’on se contente de finaliser les ressources utilisées au mieux, et de terminer le programme avec un message d’erreur laconique du genre Fatal error occured…Exiting. ce qui n’apporte pas beaucoup de consolations à l’utilisateur, il faut bien le dire. Par « finalisation » de ressources, il faut comprendre des actions du genre fermer les fichiers ouverts, terminer le traitement en cours sur des sémaphores, etc… de manière à ne pas laisser un état du système qui puisse perturber d’autres tâches de quelque manière que ce soit. Normalement, le mécanisme de destructeurs de C++ devrait pouvoir suffire à remplir ce type de tâches, pour autant que les destructeurs soient écrits correctement, et que l’erreur ne soit pas de nature trop sévère pour permettre à l’environnement run-time de C++ de continuer son travail. Le problème est de localiser les objets activés à un instant quelconque de l’exécution du programme de manière à pouvoir appeler les destructeurs, et ceci dans un ordre cohérent. (Si A et B sont des objets actifs, mais que B a été crée par A, on peut raisonnablement penser que A va également détruire B. Il ne faut donc pas appeler le destructeur de B avant celui de A, sous peine de générer une nouvelle situation d’erreur lorsque A voudra, lors de la destruction, accéder à B). On peut imaginer la complexité de la tâche dans un grand programme instanciant plusieurs milliers d’objets, comme c’est le cas typiquement pour un interface utilisateur.