Que sont les exceptions
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 situation d'erreur (exception) spécifiée se produit. Cette situation est appelée une exception.
Lorsqu'une exception est déclenchée, ce qui se produit généralement est :
· L'état actuel du code est enregistré
· L'exécution du code est basculée vers un gestionnaire d'exceptions prédéfini (personnalisé) Fonction
· Selon la situation, le processeur peut redémarrer l'exécution du code à partir de l'état du code enregistré, terminer l'exécution du script ou continuer l'exécution du script à partir d'un autre emplacement dans le code
Nous montrerons différentes gestions des erreurs méthodes :
· Utilisation de base des exceptions
· Créer un gestionnaire d'exceptions personnalisé
· Plusieurs exceptions
· Relancer les exceptions
· Définir un gestionnaire d'exceptions de niveau supérieur
PHP 5 fournit une nouvelle méthode de gestion des erreurs orientée objet. Vous pouvez utiliser les exceptions try, throw et catch. Autrement dit, utilisez try pour détecter si une exception est levée. Si une exception est levée, utilisez catch pour intercepter l'exception.
Un essai doit avoir au moins une prise correspondante. Définissez plusieurs captures pour capturer différents objets. PHP exécutera ces captures dans l'ordre dans lequel elles sont définies jusqu'à ce que la dernière soit terminée. Au sein de ces captures, de nouvelles exceptions peuvent être levées.
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é.
Utilisation de base des exceptions
Lorsqu'une exception est levée, le code suivant ne continuera pas à s'exécuter et PHP tentera de trouver un "catch" correspondant " bloc de code.
Si l'exception n'est pas interceptée et qu'il n'est pas nécessaire d'utiliser set_exception_handler() pour le traitement correspondant, alors une erreur grave (erreur fatale) se produira et "Uncaught Exception" sera affiché.
Essayons de lancer une exception sans l'attraper :
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
Le code ci-dessus obtiendra une erreur comme celle-ci :
Erreur fatale : exception non interceptée 'Exception' avec le message 'Valeur doit être 1 ou moins' dans /www/php/test/test.php:7 Trace de pile : #0 /www/php/test/test.php(13) : checkNum(2) #1 {main} lancé dans / www/php/test/test.php en ligne 7
Essayer, lancer et attraper
Pour éviter l'erreur 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 :
1. Try - Les fonctions qui utilisent des exceptions doivent être situées dans le bloc de code "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.
2. Throw - précise comment déclencher des exceptions. Chaque « lancer » doit correspondre à au moins une « prise ».
3. Catch - Le bloc de code "catch" interceptera l'exception et créera un objet contenant les informations sur l'exception.
Déclenchons une exception :
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
Le code ci-dessus obtiendra une erreur comme celle-ci :
Message : La valeur de la variable doit être inférieure ou égale à 1
Explication des exemples :
Le code ci-dessus lève une exception et l'attrape :
1 Créez la fonction checkNum(). Il détecte si le nombre est supérieur à 1. Si c'est le cas, lancez une exception.
2. Appelez la fonction checkNum() dans le bloc de code "try".
3. L'exception dans la fonction checkNum() est levée.
4. Le bloc de code "catch" reçoit l'exception et crée un objet ($e) contenant les informations sur l'exception.
5. 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 lancer doit correspondre à une capture", vous pouvez configurer un gestionnaire d'exceptions de haut niveau pour gérer les erreurs manquées.
Créer une classe d'exception personnalisée
Créer un gestionnaire d'exception personnalisé est très simple. Nous avons simplement créé une classe spécialisée dont les fonctions sont appelées lorsqu'une exception se produit en PHP. Cette classe doit être une extension de la classe d'exception.
Cette classe d'exception 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 d'exception :
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "123456789@qq.com"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Cette nouvelle classe est une copie de l'ancienne classe d'exception, plus la fonction errorMessage(). Juste 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().
Explication des exemples :
Le code ci-dessus lève une exception et l'intercepte via une classe d'exception personnalisée :
1 La classe customException() est créée en tant qu'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.
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 d'adresse e-mail illégale.
4. Exécutez le bloc de code "try" et lancez une exception car l'adresse e-mail est illégale.
5. Le bloc de code "catch" intercepte l'exception et affiche le message d'erreur.
Exceptions multiples
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 class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "123456789@qq.com "; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { throw new Exception("$email 是 example 邮箱"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Explication des exemples :
Le code ci-dessus teste deux conditions. Si l'une des conditions n'est pas vraie, il lance un Throw. exception :
1. La classe customException() est 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.
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 "exemple".
4. Exécutez le bloc de code "try". Dans la première condition, aucune exception ne sera levée.
5. Puisque l'e-mail contient la chaîne "exemple", la deuxième condition déclenchera une exception.
6. Le bloc de code "catch" interceptera l'exception et affichera le message d'erreur approprié.
Si la classe customException lève une exception, mais n'attrape pas l'exception customException, mais intercepte uniquement l'exception de base, gérez l'exception à cet endroit.
Relancer l'exception
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 class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "someone@example.com"; try { try { // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new Exception($email); } } catch(Exception $e) { // 重新抛出异常 throw new customException($email); } } catch (customException $e) { // 显示自定义信息 echo $e->errorMessage(); } ?>
Exemple d'explication :
Le code ci-dessus détecte s'il y a des caractères dans la chaîne de l'adresse e-mail " exemple". Si tel est le cas, lancez à nouveau l'exception :
1. La classe customException() est 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.
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 "exemple".
4. Le bloc "try" contient un autre bloc "try" afin que l'exception puisse être à nouveau levée.
5. Comme l'e-mail contient la chaîne "exemple", une exception est déclenchée.
6. Le bloc de code "catch" intercepte l'exception et renvoie "customException".
7. Attrapez "customException" et affichez un message d'erreur.
Si l'exception n'est pas interceptée dans le bloc "try" actuel, elle recherchera un bloc catch à un niveau supérieur.
Définir un 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('Uncaught Exception occurred'); ?>
Le résultat du code ci-dessus est le suivant :
Exception : une exception non interceptée s'est produite
Dans le code ci-dessus, il n'y a pas de bloc de code "catch", mais le le niveau supérieur est déclenché par le gestionnaire d'exceptions. Cette fonction doit être utilisée pour intercepter toutes les exceptions non interceptées.
Syntaxe de base :
essayer{
}catch(){
}
essayer, attraper est une seule pièce
Il ne peut y avoir de code entre try et catch.
1. S'il n'y a pas de problème avec le code dans try, ignorez le catch après avoir exécuté le code dans try et exécutez plus tard
2. throw Si un objet d'exception (utilisant throw) est lancé sur les paramètres dans catch, le code dans try ne sera plus exécuté. Il passera directement au catch pour l'exécution et l'exécutera en même temps.
3. Le catch indique quelle exception s'est produite, mais ce n'est pas l'essentiel. Nous devons résoudre l'exception transmise dans le catch. Si elle ne peut pas être résolue, elle sera envoyée à l'utilisateur.
Classe d'exception :
Classe d'exception intégrée (manuel de référence)
Classe d'exception personnalisée :
1. Définissez vous-même la classe d'exception. doit être une sous-classe de classe intégrée d'Exception ;
2. Seuls le constructeur et tostring() dans Exception peuvent être remplacés, et les autres sont modifiés avec le mot-clé final.
Un exemple :
<?php class openfileException{ function open(){ touch("pb160.txt","r"); $file=fopen("pb160.txt","r"); return $file; } } try{ echo "你好,我是pb!"; $file=@open("pp.txt","r"); if(!$file) throw new openfileException("打开文件失败啦!"); echo "打开文件成功时可以看到我!"; }catch(openfileException $e){ echo $e->getMessage()."<br>"; $file=$e->open(); } echo "再见了啊!"; ?>
Le but de l'écriture de votre propre classe d'exception est d'écrire une ou plusieurs méthodes pour résoudre l'exception qui se produit !
· Le code qui nécessite la gestion des exceptions doit être placé dans un bloc de code d'essai pour détecter les exceptions potentielles.
· Chaque bloc de code try ou throw doit avoir au moins un bloc de code catch correspondant.
· Utilisez plusieurs blocs de code catch pour intercepter différents types d'exceptions.
· Vous pouvez lancer (lancer à nouveau) des exceptions dans un bloc catch au sein d'un bloc try.
En bref : si une exception est levée, vous devez l'attraper.