Une autre manière de gérer les erreurs
Les erreurs en PHP sont gérés à travers le système
Error Reporting que l'on peut configurer grâce à la directive correspondante dans le fichier
php.ini.
Ce système affiche les messages d'erreur sur l'écran avec leurs différents niveaux de gravité comme les notices, les alertes ou les erreurs fatales:
- Les notices: sont des erreurs non critiques. Ils n'arrêtent pas l’exécution du programme (comme la tentative d'affichage d'une variable non initialisée).
- Les alertes: sont des erreurs dues à une mauvaise exécution d'une instruction (comme l'inclusion d'un fichier inexistant). Pourtant, le programme poursuit son exécution.
- Les erreurs fatales: sont des erreurs critiques qui interrompent l’exécution du programme (suite à une erreur de syntaxe par exemple).
Cependant, il existe une autre manière de gérer les erreurs. C'est via le système des exceptions.
La
gestion des exceptions est apparue en PHP dans sa version 5. C'est un concept très utilisé dans d'autres langages de programmation (orientés objet) comme Java, Python ou encore
Javascript...
Bloc try catch
Le principe est simple: on place le code qui peut générer une erreur éventuelle dans le bloc
try et on prévoie un traitement alternatif dans le bloc
catch. Si le bloc try ne génère aucune erreur, alors le bloc catch sera ignoré, sinon il sera exécuté pour rattraper l'erreur du bloc try.
Une exception peut être lancée grâce au mot clé
throw de n'importe où dans le programme. Une exception lancée représente une instance de la classe
Exception prédéfinie en PHP5 et plus. Il ne faut pas oublier de renseigner, au moins, le message d'erreur ou le code de celui-ci au constructeur.
Pour mieux comprendre, supposons qu'on veut executer une opération de division de $a par $b. Pour que l'opération se passe normalement, il faut que $b ne soit pas nul. Le code que je propose ressemble donc à ceci:
<?php
$a=10;
$b=0;
try{
if($b==0)
throw new Exception("Le dénominateur ne doit pas être nul.");
$c=$a/$b;
echo $c;
}
catch(Exception $e){
echo $e->getMessage();
}
?>
Dans ce cas on on obtient le résultat suivant:
Le dénominateur ne doit pas être nul.
Dans le bloc try on teste si $b est nul. Si c'est le cas, alors on lance une exception en guise d'instance de la classe
Exception en passant le message d'erreur souhaité au constructeur. Le lancement de l’exception est fait à l'aide de
throw. Dans ce cas, le reste du code dans le bloc
try est ignoré et l’exécution se poursuit directement vers le bloc
catch où on déclare le nom de l'instance de classe Exception lancée (dans ce cas $e). Dans le bloc
catch on peut faire ce qu'on veut, mais j'ai opté pour afficher le message d'erreur qui a lancé l'exception grâce à la méthode prédéfinie
getMessage().
Méthodes de la classe Exception
La classe Exception contient 6 méthodes dont les plus importants sont:
- getMessage(): retourne le message d'erreur passé au constructeur lors du lancement de l'exception.
- getCode(): retourne le code d'erreur passé aussi au constructeur.
- getLine(): retourne le numéro de la ligne où l'exception a été lancée.
- getFile(): retourne le nom du document où les choses se passent.
L'exemple précédent peut donc être amélioré comme ceci:
<?php
$a=10;
$b=0;
try{
if($b==0)
throw new Exception("Le dénominateur ne doit pas être nul.","553");
$c=$a/$b;
echo $c;
}
catch(Exception $e){
$erreur="Document: <b>".$e->getFile()."</b><br />";
$erreur.="Line: <b>".$e->getLine()."</b><br />";
$erreur.="Code d'erreur: <b>".$e->getCode()."</b><br />";
$erreur.="Message d'erreur: <b>".$e->getMessage()."</b><br />";
echo $erreur;
}
?>
Ce qui donne:
Document: index.php
Line: 6
Code d'erreur: 553
Message d'erreur: Le dénominateur ne doit pas être nul.
Bloc finally
Le bloc
finally est pris en charge à partir de PHP5.5. Ce bloc s’exécute quoi qu'il arrive (si le bloc
catch est exécuté ou non). Son rôle est, généralement, d'anticiper une erreur qui peut se lever suite au non rattrapage d'une exception lancée.
Cas pratique: classe PDOException
Dans la page suivante nous allons voir l'interface PDO qui permet au script PHP d'interroger une base de données. Pour gérer les erreurs éventuelles qui peuvent survenir lors d la manipulation de l'objet PDO (comme le renseignement d'un mauvais login ou mot de passe, ou encore une mauvaise base de données...) on fait appel à la classe
PDOException.
PDOException hérite indirectement de la classe
Exception et peut être utilisée ainsi:
<?php
try{
$pdo=new PDO("Paramètres invalides");
// Suite du traitement
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
Dans ce cas, les paramètres passés au constructeur de la classe PDO sont faux et on obtient alors:
Invalid data source name
Vous avez remarqué la simplicité que procure la classe PDOException surtout que l'exception est lancée automatiquement (sans avoir besoin de le faire à l'aidre de
throw).