L'exception est utilisée pour modifier le flux normal du script lorsqu'une erreur spécifiée se produit. Cet article expliquera en détail le fonctionnement de la gestion des exceptions php.
Qu'est-ce qu'une exception ?
PHP 5 fournit une nouvelle méthode orientée objet gestion des erreurs.
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 une fonction de gestionnaire d'exception prédéfinie
En fonction de 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 méthodes de gestion des erreurs :
Utilisation de base des exceptions
Créer des gestionnaires d'exceptions personnalisés
Exceptions multiples
Relancer Exceptions
Définir le niveau supérieur gestionnaire d'exceptions
Utilisation de base des exceptions
Lorsqu'une exception est levée, le code suivant ne continuera pas à s'exécuter et PHP essaiera de trouver un bloc de code "catch" correspondant.
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é Message d'erreur (exception non capturée).
Essayons de lancer une exception sans l'attraper :
<?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception checkNum(2); ?>
Le code ci-dessus obtiendra une erreur comme celle-ci :
Erreur fatale : exception non interceptée 'Exception'
avec le message 'La valeur doit être inférieure ou égale à 1' dans C:webfoldertest.php:6
Trace de la pile : #0 C:webfoldertest.php(12) :
checkNum(28) # 1 {main} lancé C:webfoldertest.php en ligne 6
Essayer, lancer et attraper
Pour éviter l'erreur dans l'exemple ci-dessus, nous devons créer un code approprié pour la gérer anormalement.
Le gestionnaire correct doit inclure :
Try - Les fonctions qui utilisent des exceptions doivent être 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 - Ceci spécifie comment déclencher l'exception. Chaque "lancement" doit correspondre à au moins un "catch"
Catch - le bloc de code "catch" interceptera l'exception et créera un objet contenant les informations d'exception
Déclenchons une exception :
//Créer une fonction qui peut lever une exception
function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; }//在 "try" 代码块中触发异常try { checkNum(2); //If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below'; }//捕获异常catch(Exception $e) { echo 'Message: ' .$e->getMessage(); }?>
Le code ci-dessus obtiendra une erreur comme celle-ci :
Message : La valeur doit être inférieure ou égale à 1
Exemple d'explication :
Le code ci-dessus lève une exception et l'attrape :
Create checkNum () fonction. 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 de code "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.
En appelant $e->getMessage() depuis cet objet d'exception, le message d'erreur de l'exception est généré
Cependant, afin de suivre le principe de "chaque lancer doit correspondre à a catch", Un gestionnaire d'exceptions de niveau supérieur peut être configuré 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 peuvent être appelées lorsqu'une exception survient 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() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example...com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid 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 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 lève une exception et l'attrape via une classe d'exception personnalisée :
la classe customException() est aussi ancienne Créée en tant qu'extension du classe d'exceptions. De cette façon, il hérite de toutes les propriétés et méthodes de l’ancienne classe.
Créer la fonction errorMessage(). Si l'adresse e-mail est illégale, la fonction renvoie un message d'erreur
Définissez la variable $email sur la chaîne d'adresse e-mail illégale
Exécutez le bloc de code "try", car L'adresse e-mail n'est pas valide, donc une exception est levée
Le bloc de code "catch" intercepte l'exception et affiche le message d'erreur
Plusieurs exceptions
peuvent être utilisées pour un script Plusieurs exceptions pour détecter plusieurs situations.
可以使用多个 if..else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example.com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } //check for "example" in mail address if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
例子解释:
上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常:
customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
执行 "try" 代码块,在第一个条件下,不会抛出异常。
由于 e-mail 含有字符串 "example",第二个条件会触发异常。
"catch" 代码块会捕获异常,并显示恰当的错误消息
如果没有捕获 customException,紧紧捕获了 base exception,则在那里处理异常。
重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。
脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } } $email = "someone@example.com"; try { try { //check for "example" in mail address if(strpos($email, "example") !== FALSE) { //throw exception if email is not valid throw new Exception($email); } } catch(Exception $e) { //re-throw exception throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
例子解释:
上面的代码检测在邮件地址中是否含有字符串 "example"。如果有,则再次抛出异常:
customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
把 $email 变量设置为一个有效的邮件地址,但含有字符串 "example"。
"try" 代码块包含另一个 "try" 代码块,这样就可以再次抛出异常。
由于 e-mail 包含字符串 "example",因此触发异常。
"catch" 捕获到该异常,并重新抛出 "customException"。
捕获到 "customException",并显示一条错误消息。
如果在其目前的 "try" 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。
设置顶层异常处理器 (Top Level Exception Handler)
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
以上代码的输出应该类似这样:
Exception: Uncaught Exception occurred
在上面的代码中,不存在 "catch" 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常。
异常的规则
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
使用多个 catch 代码块可以捕获不同种类的异常。
可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
本篇详细的讲解了对于php异常的处理,更多的学习资料清关注php中文网即可观看。
相关推荐:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!