Les exceptions sont utilisées pour modifier le flux normal d'un script lorsqu'une erreur spécifiée se produit.
PHP 5 fournit une nouvelle approche orientée objet de la gestion des erreurs.
La gestion des exceptions est utilisée pour modifier le flux normal d'un script lorsqu'une condition d'erreur (exception) spécifiée se produit. Cette situation est appelée une exception.
Lorsqu'une exception est déclenchée, cela 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 processeur peut redémarrer l'exécution du code à partir d'un état de code enregistré, terminer l'exécution du script ou continuer l'exécution du script à partir d'un autre emplacement du code.
Nous montrerons différentes méthodes de gestion des erreurs :
Utilisation de base des exceptions
Créer un gestionnaire d'exceptions personnalisé
Plusieurs exceptions
relancer l'exception
Définir le 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 être utilisées pour accéder à un autre emplacement du code à un point spécifié.
Lorsqu'une exception est levée, le code suivant ne continuera pas à s'exécuter et PHP tentera de trouver un bloc de code "catch" correspondant.
Si l'exception n'est pas interceptée et n'est pas gérée en conséquence à l'aide de set_exception_handler(), une erreur grave (erreur fatale) se produira et un message d'erreur « Exception non capturée » sera généré.
Essayons de lancer une exception sans l'attraper :
<?php // Crée une fonction avec gestion des exceptions fonction checkNum ( $numéro ) { si ( $nombre > 1 ) { lancer nouveau Exception ( " La valeur doit être inférieure ou égale à 1 " ) ; retour vrai ; } // déclenche une exception checkNum ( 2 ) ? >
Le code ci-dessus obtiendra une erreur similaire à celle-ci :
Erreur fatale : exception non détectée "Exception" avec le message "La valeur doit être égale ou inférieure à 1" dans /www/codercto/test/test.php:7 Trace de pile : #0 /www/codercto/test/test.php(13) : checkNum(2) #1 {main} lancé dans /www/codercto/test/test.php à la ligne 7
Pour éviter l'erreur observée dans l'exemple ci-dessus, nous devons créer le code approprié pour gérer les exceptions.
Le code de gestion des exceptions approprié doit inclure :
Try - Les fonctions qui utilisent des exceptions doivent se trouver dans un bloc "try". Si aucune exception n'est déclenchée, le code continue son exécution comme d'habitude. Mais si une exception est déclenchée, une exception sera levée.
Throw - spécifie comment déclencher l'exception. Chaque "lancer" doit correspondre à au moins une "prise".
Catch - Le bloc "catch" intercepte l'exception et crée un objet contenant les informations sur l'exception.
Déclenchons une exception :
<?php // Crée une fonction avec gestion des exceptions fonction checkNum ( $numéro ) { si ( $nombre > 1 ) { lancer nouveau Exception ( " La valeur de la variable doit être inférieure ou égale à 1 " ) ; retour vrai ; } // Déclenche une exception dans le bloc try essayer { checkNum ( 2 ) ; // Si une exception est levée, le texte suivant ne sera pas affiché écho ' Si ce contenu est affiché, expliquez la variable $ number ' ; // intercepte l'exception attraper ( exception $e ) { écho ' Message : ' . $e - > getMessage ( ) } ?>
Le code ci-dessus obtiendra une erreur similaire à celle-ci :
Message : La valeur de la variable doit être inférieure ou égale à 1
Le code ci-dessus lève une exception et l'intercepte :
Créez la fonction checkNum(). Il détecte si le nombre est supérieur à 1. Si c'est le cas, lancez une exception.
Appelez la fonction checkNum() dans le bloc "try".
Une exception dans la fonction checkNum() est levée.
Le bloc de code "catch" reçoit l'exception et crée un objet ($e) contenant les informations sur l'exception.
Affichez le message d'erreur de cette exception en appelant $e->getMessage() à partir de cet objet d'exception.
Cependant, afin de suivre le principe « chaque lancement doit correspondre à un catch », vous pouvez configurer un gestionnaire d'exceptions de niveau supérieur pour gérer les erreurs manquées.
La création de gestionnaires d'exceptions personnalisés est très simple. Nous avons simplement créé une classe spécialisée dont les fonctions peuvent être appelées lorsqu'une exception survient en PHP. Cette classe doit être une extension de la classe d'exception.
Cette classe customException personnalisée hérite de toutes les propriétés de la classe d'exception de PHP et vous pouvez y ajouter des fonctions personnalisées.
Nous commençons par créer la classe customException :
<?php classe exception personnalisée s'étend Exception { publique fonction message d'erreur ( ) { // message d'erreur $ errorMsg = ' Numéro de ligne d'erreur ' . $ this -> getLine ( ) ' $ this - > getFile ( ) ' : $ this - > getMessage ( ) ' </b> Non . Une adresse E-Mail valide ' ; $erreurMsg ; } } $email = " quelqu'[email protected] " ; essayez { // Détecter l'e-mail if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { // S'il s'agit d'une adresse e-mail illégale, lancez une exception lancer nouveau customException ( $ email ) ; } attraper ( exception personnalisée $e ) { // affiche un message personnalisé écho $e -> message d'erreur ( ) ; ?>
Cette nouvelle classe est une copie de l'ancienne classe d'exception, plus la fonction errorMessage(). Tout simplement parce qu'il s'agit d'une copie de l'ancienne classe, elle hérite des propriétés et des méthodes de l'ancienne classe, et nous pouvons utiliser les méthodes de la classe d'exception, telles que getLine(), getFile() et getMessage().
Le code ci-dessus lève une exception et l'intercepte via une classe d'exception personnalisée :
La classe customException() a été créée comme une extension de l'ancienne classe d'exception. De cette façon, il hérite de toutes les propriétés et méthodes de l’ancienne classe d’exception.
Créez la fonction errorMessage(). Si l'adresse e-mail n'est pas valide, cette fonction renvoie un message d'erreur.
Définissez la variable $email sur une chaîne d'adresse e-mail illégale.
Le bloc de code "try" est exécuté et une exception est levée car l'adresse e-mail n'est pas valide.
Le bloc de code "catch" intercepte l'exception et affiche un message d'erreur.
Vous pouvez utiliser plusieurs exceptions pour qu'un script détecte plusieurs situations.
Vous pouvez utiliser plusieurs blocs de code if..else, ou un bloc de code de commutation, ou imbriquer plusieurs exceptions. Ces exceptions peuvent utiliser différentes classes d'exceptions et renvoyer différents messages d'erreur :
<?php classe exception personnalisée s'étend Exception { publique fonction message d'erreur ( ) { // message d'erreur $ errorMsg = ' Numéro de ligne d'erreur ' . $ this -> getLine ( ) ' $ this - > getFile ( ) ' : $ this - > getMessage ( ) ' </b> Non . Une adresse E-Mail valide ' ; $erreurMsg ; } } $email = " quelqu'[email protected] " ; essayez { // Détecter l'e-mail if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { // S'il s'agit d'une adresse e-mail illégale, lancez une exception lancer nouveau customException ( $ email ) ; // Vérifiez si "exemple" est dans l'adresse e-mail if ( strpos ( $email , " exemple " ) !== FALSE ) { lancer nouveau Exception ( " $email est l'exemple de boîte aux lettres " ) ; } attraper ( exception personnalisée $e ) { écho $e -> message d'erreur ( ) ; attraper ( exception $e ) { écho $e - > getMessage ( ) ; ?>
Le code ci-dessus teste deux conditions et lève une exception si l'une ou l'autre des conditions n'est pas vraie :
La classe customException() a été créée comme une extension de l'ancienne classe d'exception. De cette façon, il hérite de toutes les propriétés et méthodes de l’ancienne classe d’exception.
Créez la fonction errorMessage(). Si l'adresse e-mail n'est pas valide, cette fonction renvoie un message d'erreur.
Définissez la variable $email sur une chaîne qui est une adresse e-mail valide mais contient la chaîne « exemple ».
Exécutez le bloc de code "try" et dans la première condition, aucune exception ne sera levée.
Puisque l'e-mail contient la chaîne "exemple", la deuxième condition déclenchera une exception.
Le bloc "catch" intercepte l'exception et affiche un message d'erreur approprié.
Si la classe customException lève une exception, mais que l'exception customException n'est pas interceptée, seule l'exception de base est interceptée, l'exception y est gérée.
Parfois, lorsqu'une exception est levée, vous souhaiterez peut-être la gérer différemment de la norme. L'exception peut être à nouveau levée dans un bloc "catch".
Le script doit masquer les erreurs système à l'utilisateur. Les erreurs système peuvent être importantes pour les programmeurs, mais elles ne intéressent pas les utilisateurs. Pour faciliter la tâche des utilisateurs, vous pouvez relancer l'exception avec un message convivial :
<?php classe exception personnalisée s'étend Exception { publique fonction message d'erreur ( ) { // message d'erreur $errorMsg = $this -> getMessage ( ) ' Ce n'est pas une adresse e-mail valide. ' ; retour $erreurMsg ; } } $email = " quelqu'[email protected] " ; essayez { essayer { // Vérifiez si "exemple" est dans l'adresse e-mail if ( strpos ( $email , " exemple " ) !== FALSE ) { // S'il s'agit d'une adresse e-mail illégale, lancez une exception lancer nouveau Exception ( $ email ) ; } attraper ( exception $e ) { // Relance l'exception lancer nouveau customException ( $ email ) ; } attraper ( exception personnalisée $e ) { // Afficher les informations personnalisées écho $e -> message d'erreur ( ) ; ?>
Le code ci-dessus détecte si la chaîne « exemple » est contenue dans l'adresse e-mail. Si c'est le cas, relancez l'exception :
La classe customException() a été créée comme une extension de l'ancienne classe d'exception. De cette façon, il hérite de toutes les propriétés et méthodes de l’ancienne classe d’exception.
Créez la fonction errorMessage(). Si l'adresse e-mail n'est pas valide, cette fonction renvoie un message d'erreur.
Définissez la variable $email sur une chaîne qui est une adresse e-mail valide mais contient la chaîne « exemple ».
Un bloc "try" contient un autre bloc "try" afin que l'exception puisse être à nouveau levée.
Comme l'e-mail contient la chaîne "exemple", l'exception est déclenchée.
Le bloc de code "catch" intercepte l'exception et renvoie "customException".
"customException" est intercepté et un message d'erreur s'affiche.
Si l'exception n'est pas interceptée dans le bloc "try" actuel, il recherchera un bloc catch à un niveau supérieur.
La fonction set_exception_handler() définit une fonction définie par l'utilisateur qui gère toutes les exceptions non interceptées.
<?php fonction monException ( $exception ) { écho " <b>Exception :</b> " , $exception -> getMessage ( ) } ; set_exception_handler ( ' monException ' ) ; nouveau Exception ( ' Une exception non interceptée s'est produite ' ) ?> ;
Le résultat du code ci-dessus ressemble à ceci :
Exception : une exception non interceptée s'est produite
Dans le code ci-dessus, il n'y a pas de bloc "catch", mais le gestionnaire d'exceptions de niveau supérieur est déclenché. Cette fonction doit être utilisée pour intercepter toutes les exceptions non interceptées.
Le code qui nécessite la gestion des exceptions doit être placé dans un bloc try pour intercepter les exceptions potentielles.
Chaque bloc try ou throw doit avoir au moins un bloc catch correspondant.
Utilisez plusieurs blocs catch pour intercepter différents types d’exceptions.
Des exceptions peuvent être levées (relancées) dans un bloc catch au sein d'un bloc try.
En bref : si une exception est levée, vous devez l'intercepter.