2.Programmation orientée objet

2.5.Lever des exceptions

Alors qu'avec un language procédurale, la gestion des erreurs se fait généralement via les valeurs retour (ex: 0 ou true pour signaler qu'il n'y a pas d'erreur, une valeur non nulle ou false pour signaler une erreur). En programmation orientée objet, un autre mécanisme peut être mis en place: les exceptions.
Une méthode qui rencontre un cas d'erreur ne va pas retourner une valeur particulière mais lever une exception. C'est à dire générer un objet de type (de base) Exception que le code appelant devra nécessairement (dans la majeure partie des cas) traiter afin que l'exécution du code ne s'arrête pas brutalement.
Remarques:
  • La POO n'oblige pas l'utilisation des Exceptions pour signaler les erreurs (et les mécanismes utilisés en programmation procédurale peuvent être utilisés) mais la mise en place des exceptions permet d'éviter qu'une erreur ne se propage sans avoir été prise en compte à la base.
Le mot clé pour lever une exception est généralement throw, ce qui donne le type de code suivant
classe MaClasse
{
    methode maMethode(parametre1) {
        si (erreur) {
            // une erreur detectee
            throw new monException(msg);
        }
    }
}
Certains langages (comme Java) imposent de préciser, dans la déclaration de la méthode, la liste des exceptions qui peuvent être levés. Ceci se fait via le mot clé throws comme suit
classe MaClasse
{
    methode maMethode(parametre1) throws monException {
        si (erreur) {
            // une erreur detectee
            throw new monException(msg);
        }
    }
}
Remarques:
  • La classe de base Exception gère généralement au moins un attribut "message" et propose donc un constructeur acceptant pour paramètre un message d'erreur.

2.6.Gérer les exceptions

Comme nous l'avons dit, il convient alors au code appelant de gérer les cas d'exception. Pour cela, les appels aux méthodes susceptibles de lever des exceptions doivent être intégrés dans un bloc "essayer"..."gérer l'exception". Ou plus concrètement un bloc try...catch. Comme dans l'exemple suivant:
try {
    voiture1.donnerPrixCarteGrise();   // appel type java
} catch (monException e) {
    // la methode a leve l'exception e
}
La variable e de l'exemple est alors l'objet de type de base Exception généré par la méthode.