Manipulation d'exception de PHP

Avec les langages orientés objet est venu le concept du bloc try-catch pour mieux gérer les exceptions et les applications qui se bloquent, et le langage de script côté serveur web le plus populaire, PHP à partir de la version 5, adopta cette idéologie.

En plaçant le code qui représente une possible chance d'échouer dans un bloc try, vous alertez PHP sur le fait qu'il doit cesser de fonctionner pour traiter correctement ce morceau de code, et qu’il doit aussi passer un contrôle sur le code placé dans le bloc catch et puis continuer à fonctionner après exécution de ce code de sauvegarde.

C’est ce que nous allons apprendre dans ce chapitre.

PHP cours tutorial

Manipulation d'exception en PHP



Les exceptions sont employées pour changer le cours normal d'un code si une erreur spécifique se produit

Qu’est ce que une exception

Avec PHP 5 une nouvel manière de traiter les erreurs orientée objet est venu.
La manipulation d'exception est employée pour changer le déroulement normal de l'exécution du code si un état (exceptionnel) spécifique d'erreur se produit.
C’est ce qu’on appelle une exception.

C'est ce qui se produit normalement quand une exception est déclenchée :
L'état courant de code est sauvé
L'exécution de code commutera à une fonction (personnalisé) prédéfinie pour traiter les exceptions
Selon la situation, le traiteur peut alors reprendre l'exécution de l'état sauvé de code, terminer l'exécution de code ou continuer d’exécuter le code d'un endroit différent dans le code
Nous montrerons différentes méthodes de gestion d'erreur :

Utilisation de base des exceptions
Création d'un traiteur personnalisé d'exception
Exceptions multiples
Relance ment d'une exception
Établissement d'un traiteur d'exception de niveau supérieur

Note : Des exceptions devraient seulement être employées avec des conditions d'erreur, et ne devraient pas être employées pour sauter à un autre endroit dans le code ou à un point spécifique.

Utilisation de base des exceptions



Quand une exception est déclenchée, le code la suivant ne sera pas exécuté, et le PHP essayera de trouver le bloc de code adéquat à exécuter.
Si une exception n'est pas interceptée, une erreur bloquante sera émise avec un message «Uncaught Exception» qui veut dire (exception non capturée).
Laissez nous faire l'essai avec une exception qui n'est pas interceptée :
Code de la page test.php:

Sélectionner le code


<?php
//créer une  fonction avec une exception
function verifierNomb($nombre)
{
if($nombre>1)
{
throw new Exception("La valeur doit être <= 1");
}
return true;
}

//traiteur  d’exception
verifierNomb(2);
?>

 
Le code ci-dessus donnera une erreur comme ceci :

Fatal error: Uncaught exception 'Exception'
with message 'La valeur doit etre <= 1' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
verifierNomb(2) #1 {main} thrown in C:\webfolder\test.php on line 6


Try(essai), throw(jet) et catch(crochet)



Pour éviter l'erreur de l'exemple ci-dessus, nous devons créer le code approprié pour manipuler une exception.
Le code approprié d'exception devrait inclure :

1. try - une fonction utilisant une exception devrait être dans un bloc de «try». Si l'exception ne se déclenche pas, le code continuera normalement. Cependant s’il y a déclenchement d'exception, une exception «est jetés»
2. throw - c'est comment vous déclenchez une exception. Chaque «throw» doit avoir au moins un «catch»
3. catch - un bloc de «catch» recherche une exception et crée un objet contenant l'information d'exception

Essai pour déclencher une exception avec le code valide :
Code de la page test.php:

Sélectionner le code


<?php
//créer une  fonction avec une exception
function verifierNomb($nombre)
{
if($nombre>1)
{
throw new Exception("La valeur doit etre <= 1");
}
return true;
}

//traiteur exception dans un  block  "try" 
try
{
verifierNomb(2);
// Si l'exception est levée, ce texte ne sera pas montré
echo 'Si vous voyez ceci, le Nombre est <= 1 ';
}

//catch exception
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>

 
Le code ci-dessus donnera une erreur comme ceci :

Message : La valeur doit être <= 1



Explication :

1. La fonction verifierNomb () est créée. Elle vérifie si un nombre est plus grand que 1. Si oui, une exception est déclenchée.
2. La fonction verifierNomb () s'appelle dans un bloc de «try»
3. L'exception dans la fonction verifierNomb () est déclenchée
4. Le bloc «catch» trouve l'exception et crée un objet ($e) contenant l'information d'exception
5. Le message d'erreur de l'exception est affiché avec echo en appelant $e->getMessage () de l'objet d'exception

Cependant, à sens unique pour venir à bout (la règle chaque throw doit avoir un catch) un traiteur d'exception de niveau supérieur est placer pour manipuler les erreurs qui glissent dans le code.

Création d'une classe d'exception personnalisée



La création d'un traiteur d'exception personnalisé est simple. Nous créons simplement une classe spéciale avec les fonctions qui peuvent s'appeler quand une exception se produit dans le PHP. La classe doit être une prolongation de la classe d'exception.
La classe d'exception personnalisée hérite des propriétés de la classe de l'exception du PHP et vous pouvez ajouter des fonctions personnalisées à la classe ainsi créée.
Exemple créer une classe d'exception :

Sélectionner le code


<?php
class customException extends Exception
{
public function errorMessage()
{
// message erreur
$errorMsg = 'Erreur à la ligne  '.$this->getLine().' dans '.$this->getFile()
.': <b>'.$this->getMessage().'</b> adresse E-mail invalide  ';
return $errorMsg;
}
}

$email = "quelqu-un@exemple..com";

try
{
// vérifier si
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// jeter exception si E-mail  n'est pas valide
throw new customException($email);
}
}

catch (customException $e)
{
// Affichage du message personnalisé
echo $e->errorMessage();
}
?>

 
La nouvelle classe est une copie de la vieille classe d'exception avec une addition de la fonction errorMessage (). Puisque c'est une copie de la vieille classe et elle hérite des propriétés et des méthodes de la vieille classe, nous pouvons employer les méthodes de classe d'exception comme le getLine () et getFile () et le getMessage ().
Explication de l’exemple :
1. La classe customException () est créée comme prolongation de la vieille classe d'exception. De cette façon elle hérite de toutes les méthodes et les propriétés de la vieille exception classent
2. La fonction errorMessage () est créée. Cette fonction renvoie un message d'erreur si une adresse email est invalide
3. La variable $email est une adresse email invalide puisque nous avons @exemple..com (deux points avant com)
4. Le bloc de «try» est exécuté et une exception est déclenchée puisque l'adresse email est invalide
5. Le bloc de «catche» attrape l'exception et affiche le message d'erreur

Exceptions multiples



Il est possible que un code emploie des exceptions multiples pour vérifier les conditions multiples.
Il est possible d'employer plusieurs blocs si et else, un commutateur ou des exceptions multiples.
Ces exceptions peuvent employer différentes classes d'exception et renvoyer différents messages d'erreur :

Sélectionner le code


<?php
class customException extends Exception
{
public function errorMessage()
{
// message erreur 
$errorMsg = 'Erreur à ligne '.$this->getLine().' dans '.$this->getFile()
.': <b>'.$this->getMessage().'</b> adresse E-mail invalide ';
return $errorMsg;
}
}

$email = "quelquun@exemple.com";

try
{
//verifier
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// jeter exception si le courriel n'est pas valide
throw new customException($email);
}
// vérifier pour «l'exemple» dans l'adresse mail
if(strpos($email, "exemple") !== FALSE)
{
throw new Exception("$email est un  exemple e-mail");
}
}

catch (customException $e)
{
echo $e->errorMessage();
}

catch(Exception $e)
{
echo $e->getMessage();
}
?>

 
Explication : 1. La classe customException () est créée comme extension de la vieille classe d'exception. De cette façon elle hérite de toutes les méthodes et les propriétés de la vieille exception classent
2. La fonction errorMessage () est créée. Cette fonction renvoie un message d'erreur si l’adresse email est invalide
3. La variable $email est une adresse email invalide puisque nous avons @exemple..com (deux points avant com)
4. Le bloc de «try» est exécuté et une exception n'est pas déclenchée sur la première condition
5. La deuxième condition déclenche une exception puisque l'email contient «exemple»
6. Le bloc de «catch» attrape l'exception et affiche le message correct d'erreur

Relancement d’exceptions

Parfois, quand une exception est déclenchée, vous pouvez souhaiter la manipuler différemment que la manière standard. Il est possible de jeter une exception une deuxième fois dans un bloc «catch».
Un code devrait cacher les erreurs système aux utilisateurs. Les erreurs système peuvent être importantes pour le codeur, mais sont sans intérêt à l'utilisateur:

Sélectionner le code


<?php
class customException extends Exception
{
public function errorMessage()
{
// message erreur 
$errorMsg = $this->getMessage().' adresse E-mail invalide.';
return $errorMsg;
}
}

$email = "quelquun@exemple.com";

try
{
try
{
//vérifier pour  "exemple" dans l’adresse mail 
if(strpos($email, "exemple") !== FALSE)
{
// jeter exception si l’E-mail n'est pas valide
throw new Exception($email);
}
}
catch(Exception $e)
{
//relancer l’exception 
throw new customException($email);
}
}

catch (customException $e)
{
//afficher message 
echo $e->errorMessage();
}
?>

 
Explication :
1. La classe customException () est créée comme prolongation de la vieille classe d'exception. De cette façon elle hérite de toutes les méthodes et les propriétés de la vieille exception classent
2. La fonction errorMessage () est créée. Cette fonction renvoie un message d'erreur si un adresse email est invalide
3. La variable $email est un email address valide, mais contient «exemple»
4. Le bloc de «try» contient un autre bloc de «try » pour pouvoir rejeter l'exception
5. L'exception est déclenchée puisque l'email contient «exemple»
6. Le bloc de «catch» attrape l'exception et re-jette un «customException»
7. Le «customException» est attrapé et affiche un message d'erreur
Si l'exception n'est pas attrapée dans son bloc courant de «try», elle recherchera un bloc de catch «à des niveaux plus élevés».

Placez un traiteur d'exception de niveau supérieur



La fonction set_exception_handler () place une fonction définie pour l'utilisateur pour manipuler toutes les exceptions non capturées (uncaught. )

Sélectionner le code


<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Une exception non capturée s’est produite ');
?>

 
Le résultat du code ci-dessus devrait être comme ceci :

Exception : Une exception non capturée s’est produite



Dans le code ci-dessus il n'y avait aucun bloc «catch ».
Au lieu de cela, le traiteur d'exception de niveau supérieur est déclenché.
Cette fonction devrait être employée pour attraper des exceptions uncaught( non capturée).


Par carabde 20 Aout 2014