Programmation orientée objet (POO) en PHP

Auteur: Mohamed CHINY Durée necessaire pour le cours de Programmation orientée objet (POO) en PHP Niveau recommandé pour le cours de Programmation orientée objet (POO) en PHP Supports vidéo disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz non disponibles pour ce cours

Page 11: Gestion des exceptions

Toutes les pages

Une autre manière de gérer les erreurs

Les erreurs en PHP sont gérés à travers le système Error Reporting que l'on peut configurer grâce à la directive correspondante dans le fichier php.ini.

Ce système affiche les messages d'erreur sur l'écran avec leurs différents niveaux de gravité comme les notices, les alertes ou les erreurs fatales:
  • Les notices: sont des erreurs non critiques. Ils n'arrêtent pas l’exécution du programme (comme la tentative d'affichage d'une variable non initialisée).
  • Les alertes: sont des erreurs dues à une mauvaise exécution d'une instruction (comme l'inclusion d'un fichier inexistant). Pourtant, le programme poursuit son exécution.
  • Les erreurs fatales: sont des erreurs critiques qui interrompent l’exécution du programme (suite à une erreur de syntaxe par exemple).

Cependant, il existe une autre manière de gérer les erreurs. C'est via le système des exceptions.

La gestion des exceptions est apparue en PHP dans sa version 5. C'est un concept très utilisé dans d'autres langages de programmation (orientés objet) comme Java, Python ou encore Javascript...

Bloc try catch

Le principe est simple: on place le code qui peut générer une erreur éventuelle dans le bloc try et on prévoie un traitement alternatif dans le bloc catch. Si le bloc try ne génère aucune erreur, alors le bloc catch sera ignoré, sinon il sera exécuté pour rattraper l'erreur du bloc try.

Une exception peut être lancée grâce au mot clé throw de n'importe où dans le programme. Une exception lancée représente une instance de la classe Exception prédéfinie en PHP5 et plus. Il ne faut pas oublier de renseigner, au moins, le message d'erreur ou le code de celui-ci au constructeur.

Pour mieux comprendre, supposons qu'on veut executer une opération de division de $a par $b. Pour que l'opération se passe normalement, il faut que $b ne soit pas nul. Le code que je propose ressemble donc à ceci:
<?php
   $a=10;
   $b=0;
   try{
      if($b==0)
         throw new Exception("Le dénominateur ne doit pas être nul.");
      $c=$a/$b;
      echo $c;
   }
   catch(Exception $e){
      echo $e->getMessage();
   }
?>
Dans ce cas on on obtient le résultat suivant:
Le dénominateur ne doit pas être nul.
Dans le bloc try on teste si $b est nul. Si c'est le cas, alors on lance une exception en guise d'instance de la classe Exception en passant le message d'erreur souhaité au constructeur. Le lancement de l’exception est fait à l'aide de throw. Dans ce cas, le reste du code dans le bloc try est ignoré et l’exécution se poursuit directement vers le bloc catch où on déclare le nom de l'instance de classe Exception lancée (dans ce cas $e). Dans le bloc catch on peut faire ce qu'on veut, mais j'ai opté pour afficher le message d'erreur qui a lancé l'exception grâce à la méthode prédéfinie getMessage().

Méthodes de la classe Exception

La classe Exception contient 6 méthodes dont les plus importants sont:
  • getMessage(): retourne le message d'erreur passé au constructeur lors du lancement de l'exception.
  • getCode(): retourne le code d'erreur passé aussi au constructeur.
  • getLine(): retourne le numéro de la ligne où l'exception a été lancée.
  • getFile(): retourne le nom du document où les choses se passent.

L'exemple précédent peut donc être amélioré comme ceci:
<?php
   $a=10;
   $b=0;
   try{
      if($b==0)
         throw new Exception("Le dénominateur ne doit pas être nul.","553");
      $c=$a/$b;
      echo $c;
   }
   catch(Exception $e){
      $erreur="Document: <b>".$e->getFile()."</b><br />";
      $erreur.="Line: <b>".$e->getLine()."</b><br />";
      $erreur.="Code d'erreur: <b>".$e->getCode()."</b><br />";
      $erreur.="Message d'erreur: <b>".$e->getMessage()."</b><br />";
      echo $erreur;
   }
?>
Ce qui donne:
Document: index.php
Line: 6
Code d'erreur: 553
Message d'erreur: Le dénominateur ne doit pas être nul.

Bloc finally

Le bloc finally est pris en charge à partir de PHP5.5. Ce bloc s’exécute quoi qu'il arrive (si le bloc catch est exécuté ou non). Son rôle est, généralement, d'anticiper une erreur qui peut se lever suite au non rattrapage d'une exception lancée.

Cas pratique: classe PDOException

Dans la page suivante nous allons voir l'interface PDO qui permet au script PHP d'interroger une base de données. Pour gérer les erreurs éventuelles qui peuvent survenir lors d la manipulation de l'objet PDO (comme le renseignement d'un mauvais login ou mot de passe, ou encore une mauvaise base de données...) on fait appel à la classe PDOException.

PDOException hérite indirectement de la classe Exception et peut être utilisée ainsi:
<?php
   try{
      $pdo=new PDO("Paramètres invalides");
      // Suite du traitement
   }
   catch(PDOException $e){
      echo $e->getMessage();
   }
?>
Dans ce cas, les paramètres passés au constructeur de la classe PDO sont faux et on obtient alors:
Invalid data source name
Vous avez remarqué la simplicité que procure la classe PDOException surtout que l'exception est lancée automatiquement (sans avoir besoin de le faire à l'aidre de throw).