PHP Gestion des exceptions


Les exceptions sont utilisées pour modifier le flux normal d'un script lorsqu'une erreur spécifiée se produit.


Qu'est-ce qu'une exception

PHP 5 fournit une nouvelle méthode de gestion des erreurs orientée objet.

La gestion des exceptions est utilisée pour modifier le flux normal d'un script lorsqu'une condition d'erreur spécifiée (exception) se produit. Cette condition est appelée une exception.

Lorsqu'une exception est déclenchée, voici ce qui se produit généralement :

  • L'état actuel du code est enregistré
  • L'exécution du code est basculée vers une fonction de gestionnaire d'exceptions prédéfinie (personnalisée)
  • Selon la situation, le gestionnaire peut reprendre l'exécution du code à partir de l'état du code enregistré, mettre fin à l'exécution du script ou poursuivre le script à partir d'un autre emplacement dans le code

Nous allons présenter différentes méthodes de gestion des erreurs :

  • Utilisation de base des exceptions
  • Création d'un gestionnaire d'exceptions personnalisé
  • Exceptions multiples
  • Relancement des exceptions
  • Définition du gestionnaire d'exceptions de niveau supérieur

Remarque :Les exceptions ne doivent être utilisées que dans des situations d'erreur et ne doivent pas servir à sauter vers un autre emplacement du code à un moment précis.


Utilisation de base des exceptions

Lorsqu'une exception est levée, le code qui suit ne continuera pas à s'exécuter, et PHP essaiera de trouver un bloc "catch" correspondant.

Si l'exception n'est pas interceptée et que set_exception_handler() n'est pas utilisé pour le traitement correspondant, une erreur grave (erreur fatale) se produira, et un message d'erreur "Uncaught Exception" sera affiché.

Essayons de lancer une exception sans l'attraper :

<?php //Créer une fonction avec gestion des exceptions function checkNum($number) { if($number>1) { throw new Exception("La valeur doit être inférieure ou égale à 1"); } return true; } //Déclencher une exception checkNum(2); ?>

Le code ci-dessus produira une erreur similaire à celle-ci :

Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/example/test/test.php:7 Stack trace: #0 /www/example/test/test.php(13): checkNum(2) #1 {main} thrown in /www/example/test/test.php on line 7

Try, throw et catch

Pour éviter l'erreur qui est apparue dans l'exemple ci-dessus, nous devons créer un code approprié pour gérer les exceptions.

Le code approprié de gestion des exceptions doit inclure :

  1. Try - La fonction qui utilise l'exception doit être à l'intérieur d'un bloc "try". Si aucune exception n'est déclenchée, le code continuera son exécution comme d'habitude. Mais si une exception est déclenchée, une exception est levée.
  2. Throw - spécifie comment déclencher une exception. Chaque "throw" doit correspondre à au moins un "catch".
  3. Catch - Le bloc "catch" intercepte l'exception et crée un objet contenant les informations sur l'exception.

Déclenchons une exception :

<?php //Créer une fonction avec gestion des exceptions function checkNum($number) { if($number>1) { throw new Exception("La valeur de la variable doit être inférieure ou égale à 1"); } return true; } //Déclencher une exception dans le bloc try try { checkNum(2); //Si une exception est levée, le texte suivant ne sera pas affiché echo 'Si ce contenu est affiché, cela signifie que la variable $number'; } //Intercepter l'exception catch(Exception $e) { echo 'Message : ' .$e->getMessage(); } ?>

Le code ci-dessus produira une erreur similaire à celle-ci :

Message: 变量值必须小于等于 1

Explication de l'exemple :

Le code ci-dessus a levé une exception et l'a interceptée :

  1. Créez une fonction checkNum(). Elle vérifie si le nombre est supérieur à 1. Si c'est le cas, elle lève une exception.
  2. Appelez la fonction checkNum() dans le bloc "try".
  3. L'exception dans la fonction checkNum() est levée.
  4. Le bloc "catch" reçoit l'exception et crée un objet contenant les informations sur l'exception ($e).
  5. En appelant $e->getMessage() sur cet objet d'exception, affichez le message d'erreur de cette exception.

Cependant, pour suivre le principe selon lequel "chaque throw doit correspondre à un catch", vous pouvez définir un gestionnaire d'exceptions de niveau supérieur pour gérer les erreurs manquées.


Création d'une classe d'exception personnalisée

Créer un gestionnaire d'exceptions personnalisé est très simple. Nous créons simplement une classe spéciale dont les fonctions peuvent être appelées lorsqu'une exception se produit en PHP. Cette classe doit être une extension de la classe d'exception.

Cette classe personnalisée customException hérite de toutes les propriétés de la classe d'exception de PHP, et vous pouvez y ajouter des fonctions personnalisées.

Commençons par créer la classe customException :

<?php class customException extends Exception { public function errorMessage() { //Message d'erreur $errorMsg = 'Numéro de ligne de l'erreur'.$this->getLine().' dans '.$this->getFile() .': <b>'.$this->getMessage().'</b> n'est pas une adresse e-mail valide'; return $errorMsg; } } $email = "[email protected]"; try { //Vérifier l'e-mail if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //Si c'est une adresse e-mail invalide, lever une exception throw new customException($email); } } catch (customException $e) { //afficher un message personnalisé echo $e->errorMessage(); } ?>

Cette nouvelle classe est une copie de l'ancienne classe d'exception, à laquelle s'ajoute la fonction errorMessage(). Comme elle est une copie de l'ancienne classe, elle hérite des propriétés et méthodes de l'ancienne classe, et nous pouvons utiliser les méthodes de la classe d'exception, telles que getLine(), getFile() et getMessage().

Explication de l'exemple :

Le code ci-dessus a levé une exception et l'a interceptée avec une classe d'exception personnalisée :

  1. La classe customException() est créée comme une extension de l'ancienne classe d'exception. De cette façon, elle hérite de toutes les propriétés et méthodes de l'ancienne classe d'exception.
  2. Créez la fonction errorMessage(). Si l'adresse e-mail est invalide, cette fonction renvoie un message d'erreur.
  3. Affectez à la variable $email une chaîne d'adresse e-mail invalide.
  4. Exécutez le bloc "try", et comme l'adresse e-mail est invalide, une exception est levée.
  5. Le bloc "catch" intercepte l'exception et affiche le message d'erreur.

Exceptions multiples

Plusieurs exceptions peuvent être utilisées pour qu'un script détecte plusieurs situations.

Vous pouvez utiliser plusieurs blocs if..else, ou un bloc switch, ou imbriquer plusieurs exceptions. Ces exceptions peuvent utiliser différentes classes d'exception et renvoyer différents messages d'erreur :

<?php class customException extends Exception { public function errorMessage() { //Message d'erreur $errorMsg = 'Numéro de ligne de l'erreur'.$this->getLine().' dans '.$this->getFile() .': <b>'.$this->getMessage().'</b> n'est pas une adresse e-mail valide'; return $errorMsg; } } $email = "[email protected]"; try { //Vérifier l'e-mail if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //Si c'est une adresse e-mail invalide, lever une exception throw new customException($email); } //Vérifier si "example" se trouve dans l'adresse e-mail if(strpos($email, "example") !== FALSE) { throw new Exception("$emailEst un e-mail d'exemple"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>

Explication de l'exemple :

Le code ci-dessus teste deux conditions, et si l'une des conditions n'est pas remplie, une exception est levée :

  1. La classe customException() est créée comme une extension de l'ancienne classe d'exception. De cette façon, elle hérite de toutes les propriétés et méthodes de l'ancienne classe d'exception.
  2. Créez la fonction errorMessage(). Si l'adresse e-mail est invalide, cette fonction renvoie un message d'erreur.
  3. Définissez la variable $email sur une chaîne qui est une adresse e-mail valide mais contient la chaîne "example".
  4. Exécutez le bloc "try" ; dans la première condition, aucune exception n'est levée.
  5. Comme l'e-mail contient la chaîne "example", la deuxième condition déclenche une exception.
  6. Le bloc "catch" intercepte l'exception et affiche un message d'erreur approprié.

Si la classe customException lève une exception, mais que customException n'est pas interceptée, et que seule l'exception de base est interceptée, alors l'exception y est gérée.


Relancement des exceptions

Parfois, lorsqu'une exception est levée, vous pouvez souhaiter la gérer différemment de la manière standard. Vous pouvez relancer l'exception dans un bloc "catch".

Les scripts doivent masquer les erreurs système aux utilisateurs. Les erreurs système peuvent être importantes pour les programmeurs, mais les utilisateurs n'y sont pas intéressés. Pour faciliter les choses aux utilisateurs, vous pouvez relancer une exception avec un message convivial :

<?php class customException extends Exception { public function errorMessage() { //Message d'erreur $errorMsg = $this->getMessage().'n'est pas une adresse e-mail valide.'; return $errorMsg; } } $email = "[email protected]"; try { try { //Vérifiez si "example" se trouve dans l'adresse e-mail if(strpos($email, "example") !== FALSE) { //S'il s'agit d'une adresse e-mail invalide, levez une exception throw new Exception($email); } } catch(Exception $e) { //Relancer l'exception throw new customException($email); } } catch (customException $e) { //Afficher un message personnalisé echo $e->errorMessage(); } ?>

Explication de l'exemple :

Le code ci-dessus vérifie si l'adresse e-mail contient la chaîne "example". Si c'est le cas, l'exception est relancée :

  1. La classe customException() est créée comme une extension de l'ancienne classe d'exception. Ainsi, elle hérite de toutes les propriétés et méthodes de l'ancienne classe d'exception.
  2. Créez la fonction errorMessage(). Si l'adresse e-mail n'est pas valide, cette fonction renvoie un message d'erreur.
  3. Définissez la variable $email sur une chaîne qui est une adresse e-mail valide mais contient la chaîne "example".
  4. Le bloc "try" contient un autre bloc "try", afin qu'une exception puisse être relancée.
  5. Comme l'e-mail contient la chaîne "example", l'exception est déclenchée.
  6. Le bloc "catch" intercepte l'exception et relance "customException".
  7. La "customException" est interceptée, et un message d'erreur est affiché.

Si l'exception n'est pas interceptée dans le bloc "try" actuel, elle cherchera un bloc catch à un niveau supérieur.


Définition du gestionnaire d'exceptions de niveau supérieur

La fonction set_exception_handler() peut définir une fonction définie par l'utilisateur qui gère toutes les exceptions non interceptées.

<?php function myException($exception) { echo "<b>Exception :</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Une exception non interceptée s'est produite'); ?>

La sortie du code ci-dessus est la suivante :

Exception: Uncaught Exception occurred

Dans le code ci-dessus, il n'y a pas de bloc "catch" ; au lieu de cela, le gestionnaire d'exceptions de niveau supérieur est déclenché. Cette fonction doit être utilisée pour intercepter toutes les exceptions qui ne sont pas interceptées.


Règles relatives aux exceptions

  • Le code qui nécessite une gestion des exceptions doit être placé à l'intérieur d'un bloc try pour intercepter les exceptions potentielles.
  • Chaque bloc try ou throw doit avoir au moins un bloc catch correspondant.
  • L'utilisation de plusieurs blocs catch permet d'intercepter différents types d'exceptions.
  • Une exception peut être levée (relancée) dans un bloc catch à l'intérieur d'un bloc try.

En bref : si une exception est levée, elle doit être interceptée.

Autres extensions