GESTION ET TRAITEMENT DES ERREURS
GESTION ET TRAITEMENT DES ERREURS Non mais, il y a trois types d’erreurs
GESTION ET TRAITEMENT DES ERREURS Non mais, il y a trois types d’erreurs Des erreurs syntaxiques. apparaissent lors de la saisie du texte de programmation liées au non respect de la syntaxe d’un opérateur du langage de programmation le compilateur (interprétateur) existant détecte la syntaxe erronée du développeur et fait apparaître le message les erreurs de ce type sont facilement corrigibles ces erreurs feront rire
GESTION ET TRAITEMENT DES ERREURS Non mais, il y a trois types d’erreurs Des erreurs en mode d’exécution. ces erreurs apparaissant lors de l’exécution du programme les causes qui les provoquent peuvent être d’ordre différent. Ainsi, les erreurs peuvent être la conséquence de données mal saisies, de valeurs de résultats intermédiaires comme la division par zéro, de l’extraction d’un chiffre négatif, des erreurs dues à des manipulations incorrectes de l’utilisateur, des erreurs des appareils, des erreurs de la programmation. Les erreurs de ce type sont prévisibles à un certain degré. Un code de programmation détectant et traitant les erreurs doit être prévu dans le projet. D’habitude plus de 50% du projet est lié au traitement d’erreurs attendues.
GESTION ET TRAITEMENT DES ERREURS Non mais, il y a trois types d’erreurs Des erreurs d’algorithme. Ce sont des erreurs dues à un algorithme erroné de traitement des données ou de gestion du programme. Ces erreurs sont difficilement détectables. Les résultats erronés ou le manque de résultats indiquent une telle erreur. Souvent les erreurs d’algorithmes provoquent l’interruption de l’exécution du programme.
GESTION ET TRAITEMENT DES ERREURS Toutes les erreurs survenues lors de l’exécution du programme ne peuvent pas être dépistées mais . . . Le langage C++ contient des énoncés de gestion des erreurs Ce sont des interruptions de l'exécution du programme à la suite d'un événement particulier. Le but des exceptions est de réaliser des traitements spécifiques aux événements qui en sont la cause. Ces traitements peuvent rétablir le programme dans son mode de fonctionnement normal, auquel cas son exécution reprend. Il se peut aussi que le programme se termine, si aucun traitement n'est approprié.
GESTION ET TRAITEMENT DES ERREURS Généralement, vous devez d'abord d'effectuer le traitement prévu, et si cela entraîne une erreur, vous pourrez capturer l'exception lancée par la directive throw. Sa syntaxe est la suivante : throw objet; Par conséquent, vous proposez alors une alternative correspondant au type de l'exception. En fait, et plus précisément, chaque exception est caractérisée par un type, et le choix du bon gestionnaire se fait en fonction de la nature de l'expression mentionnée à throw. Cette phase est réalisée par les directives try – catch (essayer et capturer).
GESTION ET TRAITEMENT DES ERREURS En C++, lorsqu'il faut lancer une exception, on doit créer un objet dont la classe caractérise cette exception, et utiliser le mot clé throw. Sa syntaxe est la suivante : throw objet; où objet est l'objet correspondant à l'exception. Cet objet peut être de n'importe quel type, et pourra ainsi caractériser pleinement l'exception. L'exception doit alors être traitée par le gestionnaire d'exception correspondant. On ne peut attraper que les exceptions qui sont apparues dans une zone de code limitée (cette zone est dite protégée contre les erreurs d'exécution), pas sur tout un programme. On doit donc placer le code susceptible de lancer une exception d'un bloc d'instructions particulier. Ce bloc est introduit avec le mot clé try : try { // Code susceptible de générer des exceptions... }
GESTION ET TRAITEMENT DES ERREURS Runtime error - comment ça marche? Si vous n’utilisez pas le gestionnaire de traite- ment des erreurs, alors le programme appelle la fonction terminate() définie dans la bibliothèque du C++ standard. Cette fonction propose un comportement par défaut, qui appelle notamment la fonction abort(), qui elle-même indique par l’affichage d’une boîte de message que le programme se termine anormalement. Voir exemple à l’acétate suivante
GESTION ET TRAITEMENT DES ERREURS Par exemple: Deux anomalies possibles : D'une part, une mauvaise proposition d'indice qui nous envoie en dehors des limites du tableau. D'autre part, une taille de tableau négative.
GESTION ET TRAITEMENT DES ERREURS Détecter les anomalies La première démarche, et ce n'est pas toujours la plus facile, consiste à recenser toutes les anomalies possibles au sein d'un programme, dues généralement, à une mauvaise manipulation de la part du programmeur qui l'utilise.
GESTION ET TRAITEMENT DES ERREURS Éventuellement, le développeur qui construit le programme pourrait envisager de proposer une solution dans tous les cas exceptionnels possibles, mais alors du code inutilement développé entraîne une perte de productivité au niveau du temps de travail et des délais à respecter. Dont dans certains cas, il est préférable que le concepteur du programme laisse l'initiative à l'utilisateur et par conséquent juste prévenir l’utilisateur du système qu'il y a un problème, à l’aide d’un message clair et précis. L’ajout d’une trace (« bavard ») des touches et des entrées fait par l’usager d’un programme aidera aussi le suivi de la maintenance du système.
GESTION ET TRAITEMENT DES ERREURS Interception et gestion d'une exception // Exemple de programme contenant une gestion d'exception #include <iostream> #include <exception> using namespace std; class ErreurIndice { }; bool correcte; int indice; int valeur; const int dimension = 5; int tableau[dimension]; void main() { do { correcte = true; try { cout << "Dans quelle case voulez-vous entrer la valeur ? "; cin >> indice; if (indice >= dimension || indice < 0) throw ErreurIndice(); cout << "Valeur : "; cin >> valeur; tableau[indice] = valeur; } catch (ErreurIndice) cerr << endl << endl << "Attention, votre indice n'est pas correcte" << endl << endl << endl; correcte = false; } while (!correcte); cout << "Le tableau d\'indice " << indice << " a pour contenu " << tableau[indice] << endl << endl; system("pause"); Exécution:
GESTION ET TRAITEMENT DES ERREURS Les gestionnaires d'exceptions doivent suivre le bloc try. Ils sont introduits avec le mot clé catch : catch classe { // Traitement de l'exception associée à la classe }
GESTION ET TRAITEMENT DES ERREURS Propager une exception Il est possible qu'une clause unique ne puisse pas gérer une exception complètement. Après quelques actions correctives, une clause catch peut décider que l'exception sera gérée par un bloc try-catch de niveau supérieur. Il suffit pour cela de propager l'exception. Dans un gestionnaire, l'instruction throw (sans expression) retransmet (propage) l'exception au niveau englobant.
GESTION ET TRAITEMENT DES ERREURS Gestionnaire pour toute les exceptions catch(…): permet d'intercepter les exceptions de tous types, non traitées par les blocs catch déclarés dans le programme.
GESTION ET TRAITEMENT DES ERREURS Notez que les objets de classe de stockage automatique définis dans le bloc try sont automatiquement détruits lorsqu'une exception fait sortir le contrôle du programme de leur portée. C'est également le cas de l'objet construit pour lancer l'exception. les blocs catch peuvent recevoir leurs paramètres par valeur ou par référence,. Il peut y avoir plusieurs gestionnaires d'exceptions. Chacun traitera les exceptions qui ont été générées dans le bloc try et dont l'objet est de la classe indiquée par son paramètre.