Détection des erreurs
Détection des erreurs Introduction Origine des erreurs Traitement des erreurs En C En C++/JAVA Les exceptions
Introduction Le développement et l’utilisation d’un programme implique la gestion de nombreuses erreurs. Du plus souhaitable au moins souhaitable, on peut citer le statut des différentes erreurs : 1. erreurs détectées à la compilation 2. erreurs détectées et traitées (corrigées) à l’exécution 3. erreurs détectées et non traitées à l’exécution 4. erreurs non détectées à l’exécution
Origine des erreurs Erreurs d’entrée/sortie faute de saisie de l’utilisateur fichier corrompu ou inaccessible Erreurs de matériel Imprimante déconnectée disque dur saturé connexion réseau défaillante Erreurs de programmation index de tableau invalide emploi d’une variable référence non initialisée
Traitement des erreurs En présence d’une erreur, un programme se comporte selon l'un des trois scenarii suivants : idéalement : il permet de revenir à un état défini et de poursuivre ainsi l’exécution. honnêtement : il avertit l’utilisateur, permet une sortie correcte après une sauvegarde de l’ensemble du travail en cours. lamentablement : il s’interrompt brusquement (avec éventuellement un message d’erreur peu clair)
Traitement des erreurs en C Conventions de programmation valeurs spéciales de retour positionnement de flags Mais aucune garantie que les conventions soient suivies par tout le monde.
Traitement des erreurs en C++/java Gestion d'exceptions Si un problème survient, une exception est levée. Toute exception peut/doit être attrapée. Le code de gestion des exceptions est placé à part. Faire la question 1 du support de cours
Lancement d'une exception : throw Dans le corps d’une méthode à tester, figure (éventuellement) une ou plusieurs instructions spéciales « throw » permettant de lever une exception.
Que réalise la classe Vect ? Exemple #include <cstdlib> using namespace std ; // déclaration et définition d'une classe vect_limite pour gérer une exeption de dépassement de limite class VectLimite { }; class Vect { private : int nelem ; int * adr ; public : Vect (int); ~Vect (); int & operator [] (int i); Vect::Vect (int n): nelem(n) { adr = new int [n] ; } Vect::~Vect () delete []adr ; int & Vect::operator [] (int i) if (i<0 || i>=nelem) VectLimite lim; throw (lim) ; return adr [i] ; Si le paramètre i n’est pas correct, déclenchement d’une exception Que réalise la classe Vect ?
Les exceptions Faire la question 2 du support de cours
Les exceptions Une exception est un objet transmis lors du défaut Avant de lever (lancer) une exception, celle-ci doit être créée. lever/lancer : throw créer : new Une exception peut être attrapée dans tout contexte plus général. attraper : catch
Attraper une exception Un bloc try { } délimite le code à surveiller Un ou plusieurs blocs catch(… ) { } suivent: chaque bloc catch(… ) permet de récupérer la main pour traiter un type d'erreurs. ils sont considérés dans l'ordre jusqu'à ce que l'exception levée corresponde au type ou à un sous-type de celui indiqué en argument.
Gérer une exception Certaines méthodes peuvent lancer des Exceptions. Il est nécessaire lorsqu'on utilise une telle méthode : Soit d’attraper les exceptions levées soit de laisser passer les exceptions
Exemple exception cas limite // traitement de l’exception vect_limite int main () { try // Zone de surveillance Vect v(10) ; v[11] = 5 ; // Ici déclenchement d’une exception // car l’indice est trop grand } catch (VectLimite lim) // Traitement de l’exception cout << "exception cas limite" << endl ; exit (-1) ; // Sortie du programme exception cas limite
Faire les questions 3-4 du support de cours
Exemple (cas limite) // déclaration - définition des deux classes pour les exceptions class VectLimite { public : int hors ; // valeur de l'indice hors limites VectLimite (int i) { hors = i ; } } ; class VectCreation int nb ; // nombre éléments demandes VectCreation (int i) { nb = i ; } Attention: Attributs publics!!
Exemple (cas limite) // Redéfinition du constructeur de la classe Vect Vect::Vect (int n) { if (n <= 0) { // anomalie VectCreation pbCreation(n) ; throw pbCreation ; } // construction si n est correct adr = new int [n] ;
Exemple (cas limite) // surcharge de l'opérateur [] int & Vect::operator [] (int i) { if (i<0 || i>nelem) { // anomalie VectLimite pbLimite(i) ; throw pbLimite ; } return adr [i] ; // fonctionnement normal
Exemple (cas hors intervalle) // Programme exemple pour intercepter les exceptions int main () { try // Zone de surveillance Vect v(-3) ; // provoque l'exception vect_creation v[11] = 5 ; // provoquerait l'exception vect_limite } catch (VectLimite lim) // Traitement de l’exception vect_limite cout << "exception indice " << lim.hors << " hors limites " << endl ; exit (-1) ; catch (VectCreation crea) // Traitement de l’exception vect_creation { cout << "exception creation vect nb elem = " << crea.nb << endl ; exception creation vect nb elem = -3
Faire les questions 5-6 du support de cours. Faire le diagramme de classe final.