Maison > développement back-end > tutoriel php > À propos des opérations de gestion des exceptions PHP

À propos des opérations de gestion des exceptions PHP

jacklove
Libérer: 2023-03-25 15:02:01
original
1419 Les gens l'ont consulté

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);
?>
Copier après la connexion

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 &#39;If you see this, the number is 1 or below&#39;;
   }//捕获异常catch(Exception $e)
    { echo &#39;Message: &#39; .$e->getMessage();
     }?>
Copier après la connexion

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 = &#39;Error on line &#39;.$this->getLine().&#39; in &#39;.$this->getFile()
  .&#39;: <b>&#39;.$this->getMessage().&#39;</b> is not a valid E-Mail address&#39;;
  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();
 }
?>
Copier après la connexion

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 = &#39;Error on line &#39;.$this->getLine().&#39; in &#39;.$this->getFile()
.&#39;: <b>&#39;.$this->getMessage().&#39;</b> is not a valid E-Mail address&#39;;
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();
 }
?>
Copier après la connexion

例子解释:

上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常:

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().&#39; is not a valid E-Mail address.&#39;;
  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();
 }
?>
Copier après la connexion

例子解释:

上面的代码检测在邮件地址中是否含有字符串 "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(&#39;myException&#39;);
throw new Exception(&#39;Uncaught Exception occurred&#39;);
?>
Copier après la connexion

以上代码的输出应该类似这样:

Exception: Uncaught Exception occurred

在上面的代码中,不存在 "catch" 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常。

异常的规则

需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。

每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。

使用多个 catch 代码块可以捕获不同种类的异常。

可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。

本篇详细的讲解了对于php异常的处理,更多的学习资料清关注php中文网即可观看。

相关推荐:

关于PHP 文件打开/读取/读取相关知识

关于PHP Include 文件的讲解

关于PHP EOF(heredoc) 的使用说明

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal