PHP, comme beaucoup d'autres langage de programmations, intègre une gestion des exception. Il est ainsi possible de les lancer (throw) et de les capturer (catch).
Il est vrai que lorsque l'on débute en PHP les exceptions peuvent faire peur mais elles vous permettent de mieux gérer les problèmes qui peuvent arriver dans votre code.
Le Throw
Le throw permet de lever une exception. Il va par défaut stopper l'exécution du script PHP, un peu comme un die(), mais contrairement à ce dernier il peut être capturé gràce au try/catch. La commande throw doit renvoyer une instance de la class Exception.
<?php
function divide($a, $b){
// On évite les divisions par 0
if($b == 0){
throw new Exception('Division par 0 impossible');
}
return $a/$b;
}
Le constructeur prend 2 paramètre, le premier est le message d'erreur, le second est le code d'erreur (util lors de la capture)
Le try catch
Donc maintenant qu'une exception est levée on se retrouve dans la même situation qu'avec un die(). Il est possible de capturer ces exception et d'exécuter un code lorsque cette erreur est capturée plutôt que de stopper le script. Pour cela, il suffit d'entourer le code qui peut "throw" une exception par un try.
<?php
try{
$a = 1;
$b = 0;
$resultat = divide($a, $b);
} catch (Exception $e) {
$resultat = 0;
// Ou si on veut le message, $e->message
}
$c = 4; // Le code après un try catch continue à séxécuter
Dans cet exemple on exécute une division qui dans certains cas peut renvoyer une erreur (division par 0). Dans ce cas, l'erreur sera capturée et l'exception renvoyée sera capturée dans le catch ($e prendra la valeur de l'Exception renvoyé, new Exception).
Exceptions personnalisées
La class Exception est une class que l'on peut étendre comment n'importe quelle class. On peut donc créer une class personnalisée et la faire étendre de Exception
class DivisionPar0Exception extends Exception{
// Ici on peut rajouter de nouvelles méthodes
}
Et on peut ensuite utiliser cette class pour lever une erreur
throw new DivisionPar0Exception();
Il suffit juste que l'instance que vous renvoyez hérite de la class Exception (c'est le seul requis).
Catch multiple
Vous pouvez faire plusieurs catch pour capturer les différentes erreurs possible et exécuter un code différent suivant les cas. Un catch (Exception $e) capturera toutes les erreurs car toutes nos class hérite de cette class là.
try{
// un code qui lève une erreur
} catch (DivisionPar0Exception $e) {
// Une division par 0
} catch (PDOException $e) {
// Une erreur liée à la base de donnée
} catch (Exception $e) {
// Un autre type d'erreur
}
Un point sur les namespace
Si vous utilisez des namespaces il est important de noter que la class Exception se trouve au niveau racine. Donc si vous êtes dans un namespace particulier vous devrez prefixer avec un .
<?php
// namespace perso
throw new \Exception();
class CustomException extends \Exception{ }
Le mot de la fin
Voila vous savez tout ce qu'il y a à savoir sur les Exception donc je ne veux plus voir de die('lol ça a planté'); dans votre code !