English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Online Tools

PHP Basic Tutorial

PHP Advanced Tutorial

PHP & MySQL

Gestion des exceptions PHP

Fonction Object

Dans ce tutoriel, vous apprendrez à lancer et capturer des exceptions en PHP.

Qu'est-ce qu'une exception

Les exceptions sont des signaux indiquant que quelque chose d'anormal s'est produit ou qu'une erreur s'est produite. Les exceptions peuvent être causées par de multiples raisons, telles que des échecs de connexion ou de requête de base de données, un fichier que vous essayez d'accéder qui n'existe pas, etc.PHP fournit un mécanisme de gestion des exceptions puissant qui vous permet de traiter les exceptions de manière élégante. Contrairement aux méthodes traditionnelles de PHPd'erreurLa gestion des exceptions est une méthode utilisée pour traiter les erreursLa méthode, qui fournit une forme de rapport d'erreur plus spécifique et flexible. 5introduites.

Utilisation des instructions Throw et Try ... Catch

Dans une méthode basée sur les exceptions, le code est écrit dans un bloc try, et lorsque des événements d'exception se produisent pendant l'exécution du code dans le bloc try, l'instruction throw peut être utilisée pour lancer une exception. Puis elle est capturée et analysée par un ou plusieurs blocs catch.

L'exemple suivant montre comment le traitement des exceptions fonctionne :

<?php
function division($dividend, $divisor) {
    //Si le diviseur est zéro, une exception est lancée
    if($divisor == 0) {
        throw new Exception('Division par zéro.');
    } else {
        $quotient = $dividend / $divisor;
        echo "<p>$dividend / $divisor = $quotient</p>";
    }
}
 
try{
    division(10, 2);
    division(30, -4);
    division(15, 0);
    
    //Si une exception est lancée, les lignes suivantes ne seront pas exécutées
    echo '<p>Toutes les opérations ont été exécutées avec succès.</p>';
} catch(Exception $e){
    //Gérer l'exception
    echo "<p>Exception capturée: " . $e->getMessage() . "</p>";
}
 
// Continuer l'exécution
echo "<p>Hello World!/p>";
?>

Vous pourriez vous demander de quoi ce code parle. Bonne, laissons-nous passer en revue chaque partie de ce code pour mieux comprendre.

Explication de l'utilisation du code

Le système de gestion des exceptions en PHP comporte quatre parties fondamentales : try, throw, catch et la classe Exception. La liste suivante décrit le fonctionnement de chacun de ces éléments.

  • La fonction division() dans l'exemple vérifie si le dénominateur est égal à zéro. Si c'est le cas, elle lance une exception via la directive throw de PHP. Sinon, cette fonction effectue la division avec les nombres fournis et affiche le résultat.

  • Ensuite, dans le bloc try, appeler la fonction division() avec différents paramètres. Si une exception est générée lors de l'exécution du code dans le bloc try, PHP arrête l'exécution à ce point et essaie de trouver le bloc catch correspondant. Si celui-ci est trouvé, le code du bloc catch est exécuté, sinon, une erreur fatale est générée.

  • Le bloc catch capture généralement les exceptions lancées dans le bloc try et crée un objet contenant des informations sur l'exception ($e). Vous pouvez utiliser la méthode getMessage() de l'exception pour récupérer le message d'erreur de cet objet.

Dans la classe d'exception PHP, des méthodes telles que getCode(), getFile(), getLine() et getTraceAsString() sont fournies pour générer des informations de débogage détaillées.

<?php
//关闭默认错误报告
error_reporting(0);
 
try{
    $file = "somefile.txt";
    
    //尝试打开文件
    $handle = fopen($file, "r");
    if(!$handle){
        throw new Exception("无法打开文件!", 5);
    }
    
    //尝试读取文件内容
    $content = fread($handle, filesize($file));
    if(!$content){
        throw new Exception("Could not read file!", 10);
    }
    
    //关闭文件句柄
    fclose($handle);
    
    //显示文件内容
    echo $content;
} catch(Exception $e){
    echo "<h3>Caught Exception!/h3>";
    echo "<p>Error message: " . $e->getMessage() . "</p>";    
    echo "<p>File: " . $e->getFile() . "</p>";
    echo "<p>Ligne: " . $e->getLine() . "</p>";
    echo "<p>Code d'erreur: " . $e->getCode() . "</p>";
    echo "<p>Trace: " . $e->getTraceAsString() . "</p>";
}
?>

Le constructeur de l'exception peut choisir d'accepter un message d'exception et un code d'exception. Bien que le message d'exception soit généralement utilisé pour afficher des informations générales sur la cause de l'erreur, le code d'exception peut être utilisé pour classifier les erreurs. Ce code d'exception peut ensuite être récupéré via la méthode getCode() de Exception.

Conseil :Les exceptions ne s'appliquent qu'aux cas spéciaux ; elles ne devraient pas être utilisées pour spécifier le flux normal de l'application, par exemple, pour sauter à un autre endroit du script. Cela pourrait nuire à la performance de l'application.

Définir des exceptions personnalisées

Vous pouvez même définir votre propre gestionnaire d'exceptions personnalisées pour traiter différemment les différents types d'exceptions. Cela permet d'utiliser un bloc catch distinct pour chaque type d'exception.
Vous pouvez étendre la classe Exception pour définir des exceptions personnalisées, car Exception est la classe de base de toutes les exceptions. La classe d'exception personnalisée hérite de toutes les propriétés et méthodes de la classe Exception PHP. Vous pouvez également ajouter des méthodes personnalisées à la classe d'exception personnalisée. regardons l'exemple suivant :

<?php
//Extension de la classe Exception
class EmptyEmailException extends Exception {}
class InvalidEmailException extends Exception {}
 
$email = "[email protected]";
 
try{
    //Si l'e-mail est vide, lancez une exception
    if($email == ""){
        throw new EmptyEmailException("<p>Entrez votre adresse e-mail !</p>");
    }
    
    //Si l'e-mail n'est pas valide, lancez une exception
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {           
        throw new InvalidEmailException("<p><b>$email</b>非有效的电子邮件地址!</p>");
    }
    
    // Si l'e-mail est valide, affichez un message de succès
    echo "<p>成功:电子邮件验证成功.</p>";
catch(EmptyEmailException $e){
    echo $e->getMessage();
catch(InvalidEmailException $e){
    echo $e->getMessage();
}
?>

Dans l'exemple ci-dessus, nous avons dérivé deux nouvelles classes d'exceptions à partir de la classe de base Exception :EmptyEmailExceptionetInvalidEmailException. Plusieurs blocs de capture sont utilisés pour afficher différents messages d'erreur, en fonction du type d'exception générée.

Comme ces classes d'exceptions personnalisées héritent des attributs et des méthodes de la classe Exception, nous pouvons utiliser les méthodes de classe des exceptions, telles que getMessage(), getLine(), getFile(), pour récupérer les informations d'erreur de l'objet d'exception.

Définir un gestionnaire d'exception global

Comme discuté précédemment dans ce chapitre, si une exception n'est pas capturée, PHP génère un message d'erreur fatal accompagné du message "Uncaught Exception ...". Ce message d'erreur peut contenir des informations sensibles, telles que le nom de fichier et le numéro de ligne où le problème est survenu. Si vous ne souhaitez pas rendre ces informations publiques à l'utilisateur, vous pouvez créer une fonction personnalisée et l'enregistrer en tant que gestionnaire d'exceptions global via la fonction set_exception_handler() pour traiter toutes les exceptions non capturées.

<?php
function handleUncaughtException($e){
    //Afficher un message d'erreur générique à l'utilisateur
    echo "Ah ! Un problème est survenu. Veuillez réessayer, si le problème persiste, veuillez nous contacter.";
    
    // Construire une chaîne d'erreur
    $error = "Uncaught Exception: " . $message = date("Y-m-d H:i:s - ");
    $error .= $e->getMessage() . " in file " . $e->getFile() . " on line " . $e->getLine() . "\n";
    
    //Enregistrer les détails des erreurs dans le fichier
    error_log($error, 3, "var/log/exceptionLog.log");
}
 
//Enregistrer un gestionnaire d'exceptions personnalisé
set_exception_handler("handleUncaughtException");
 
// Lancer une exception
throw new Exception("Testing Exception!");
?>

Attention :Les exceptions non capturées entraînent toujours la terminaison du script. Par conséquent, si vous souhaitez que le script continue d'exécuter après un point d'exception, chaque bloc try doit au moins comporter un bloc catch correspondant.