gestion des exceptions PHP
Exception pour modifier l'erreur de script se produit lorsque le flux normal spécifié.
Ce qui est anormal
PHP 5 offre une nouvelle méthode d'erreur orientée objet de manipulation.
La gestion des exceptions est utilisée lorsque l'erreur spécifié (exception) se produit pour changer l'écoulement normal du script. Cette condition est appelée une exception.
Quand une exception est déclenchée, généralement, il se produit:
- état de code actuel est enregistré
- L'exécution de code est mis à un (personnalisé) fonction prédéfinie de gestionnaire d'exception
- Dans certains cas, le processeur peut être redémarré à partir du code stocké dans le code d'état, mettre fin à l'exécution du script ou continuer le script à partir d'un code d'emplacement différent
Nous allons montrer les différentes méthodes de traitement des erreurs:
- utilisation exception de base
- Création d'un gestionnaire d'exception personnalisée
- exceptions multiples
- Rethrows
- Top-level gestionnaire d'exceptions ensemble
Note: Des exceptions ne devraient utiliser en cas d'erreur, il ne devrait pas être utilisé dans un point spécifié pour passer à un autre emplacement dans le code.
utilisation exception de base
Quand une exception est levée, le code ultérieur ne procède pas, PHP va essayer de trouver la correspondance bloc "catch".
Si une exception est pas pris, mais pas avec l'utilisation de set_exception_handler () pour le traitement correspondant, puis une grave erreur (erreur fatale) se produit, et les messages de la sortie "Exception Uncaught" (Uncaught exception) d'erreur.
Essayons de lancer une exception, mais ne pas 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 recevra une erreur semblable à ceci:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7
Essayez, lancer et à attraper
Pour éviter les erreurs apparaissant dans l'exemple ci-dessus, nous avons besoin de créer le code approprié pour gérer les exceptions.
Une manipulation correcte code d'exception devrait inclure:
- Essayez - en utilisant la fonction anormale doit être situé dans le bloc "essayer". Si aucune exception est déclenchée, le code continuera comme d'habitude. Toutefois, si une exception est déclenchée, elle lancera une exception.
- Jetez - dans la façon de déclencher les dispositions d'exception. Chaque «jeter» doit correspondre à au moins un "catch".
- Catch - bloc "catch" intercepte l'exception et crée un objet contenant le message d'exception.
Laissez déclencher 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 obtiendrez une erreur comme ceci:
Message: 变量值必须小于等于 1
Exemples expliquent:
Le code ci-dessus renvoie une exception et l'attrape:
- Créer la fonction checkNum (). Détecte si un nombre est supérieur à un. Dans ce cas, une exception est levée.
- Appel de la fonction checkNum () dans un bloc "essayer".
- checkNum () fonction exception est levée.
- "Catch" bloc reçoit l'exception et crée un objet qui contient des informations sur l'exception ($ e).
- En appelant e- $ de cette exception objets> getMessage (), la sortie du message d'erreur pour l'exception.
Toutefois, afin de suivre la "chaque lancer doit correspondre à une prise« principe, vous pouvez configurer un gestionnaire d'exception de haut niveau pour gérer les erreurs manquées.
Créer une classe d'exception personnalisée
Création d'un gestionnaire d'exception personnalisée est très simple. Nous créons simplement une classe spéciale, lorsqu'une exception se produit en PHP, vous pouvez appeler ses fonctions. La classe doit être une extension de la classe d'exception.
La classe d'exception personnalisée hérite de tous les attributs définis dans la classe d'exception PHP, vous pouvez ajouter des fonctions personnalisées.
Commencez par créer des classes 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 = "[email protected]"; 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 (). Parce qu'il est une copie de l'ancienne classe, il hérite des anciennes propriétés et méthodes de classe, nous pouvons utiliser les méthodes de la classe d'exception, comme getLine (), getFile () et getMessage ().
Exemples expliquent:
Le code ci-dessus renvoie une exception, et à travers une classe d'exception personnalisée pour capturer:
- customException () classe comme une extension de l'ancienne classe d'exception pour créer. Alors qu'il hérite de tous les attributs et les méthodes de l'ancienne classe d'exception.
- Créer la fonction errorMessage (). Si l'adresse e-mail est invalide, la fonction renvoie un message d'erreur.
- La variable $ email est réglé invalide Adresse e-mail chaîne.
- La mise en œuvre de "essayer" bloc, car l'adresse e-mail est pas valable, et jette donc une exception.
- "Catch" bloc pour attraper l'exception et affiche un message d'erreur.
exceptions multiples
Vous pouvez utiliser plusieurs exceptions comme un script pour détecter une variété de situations.
Vous pouvez utiliser le bloc multiple if..else, ou un bloc de commutateur de code, ou imbriquer plusieurs exceptions. Ces exceptions peuvent utiliser différentes classes d'exception et de retour 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 = "[email protected]"; 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(); } ?>
Exemples expliquent:
Le code ci-dessus teste deux conditions, le cas échéant une condition est pas satisfait, puis lancer une exception:
- customException () classe comme une extension de l'ancienne classe d'exception pour créer. Alors qu'il hérite de tous les attributs et les méthodes de l'ancienne classe d'exception.
- Créer la fonction errorMessage (). Si l'adresse e-mail est invalide, la fonction renvoie un message d'erreur.
- La variable $ email est défini sur une chaîne qui est une adresse e-mail valide, mais contient la chaîne "exemple".
- La mise en œuvre de "essayer" bloc de code dans la première condition, sans exception est levée.
- Depuis l'e-mail contient la chaîne "exemple", la seconde condition déclenche une exception.
- "Catch" bloc intercepte l'exception et affiche le message d'erreur approprié.
Si customException classe exception est levée, mais pas pris customException, capturé seulement une exception de base, où les exceptions de la poignée.
Rethrows
Parfois, quand une exception est levée, vous voudrez peut-être différente de la manière standard pour le gérer. Peut encore être jeté dans un bloc "catch".
Le script doit être caché des erreurs du système de l'utilisateur. Pour les programmeurs, les erreurs de système peuvent être importants, mais l'utilisateur ne souhaite pas eux. Pour le rendre plus facile pour les utilisateurs à utiliser, vous pouvez lancer une exception à nouveau avec un message relativement facile à utiliser:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "[email protected]"; 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(); } ?>
Exemples expliquent:
Le code ci-dessus est détectée dans l'adresse e-mail si elle contient la chaîne "exemple". S'il n'y a, à nouveau, une exception est levée:
- customException () classe comme une extension de l'ancienne classe d'exception pour créer. Alors qu'il hérite de tous les attributs et les méthodes de l'ancienne classe d'exception.
- Créer la fonction errorMessage (). Si l'adresse e-mail est invalide, la fonction renvoie un message d'erreur.
- La variable $ email est défini sur une chaîne qui est une adresse e-mail valide, mais contient la chaîne "exemple".
- "Essayer" bloc contient un autre bloc "essayer" de code, de sorte que vous pouvez lancer une exception à nouveau.
- Depuis l'e-mail contient la chaîne "exemple", et donc déclencher une exception.
- "Catch" bloc pour attraper l'exception et re-jeter "customException".
- Capturé "customException", et affiche un message d'erreur.
Si une exception est pas pris dans le bloc courant "essayer", il semble pour le bloc de capture à un niveau supérieur.
Top-level gestionnaire d'exceptions ensemble
fonction set_exception_handler () peut être configuré pour gérer toutes exception uncaught des fonctions définies par l'utilisateur.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
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", mais le gestionnaire d'exception de haut niveau déclenché. Cette fonction devrait être utilisée pour capturer toute exception uncaught.
Règle d'exception
- Code de gestion des exceptions doit être placé dans un bloc d'essai, afin d'intercepter les exceptions possibles.
- Chaque lancer ou bloc de code doit avoir au moins un bloc catch correspondant.
- Vous pouvez utiliser plusieurs blocs catch pour attraper différents types d'exceptions.
- Peut-être dans le bloc de code try lance bloc catch (encore une fois jeté) d'exception.
En bref: Si vous jetez une exception, vous devez l'attraper.