Commentaires

Le concept


Tu as déjà utilisé des exceptions?

Arthur, l'apprenti développeurOui le try/catch j'ai déjà fait ça, mais je ne me souviens plus très bien.

Bon tu va voir c'est très simple, une exception c'est en quelque sorte une erreur. L'avantage des exceptions est qu'on peut les faire remonter dans l'application. C'est à dire que si une méthode A appelle une méthode B, et que la méthode B a un comportement qui ne correspond pas à ce que l'on attend, elle va remonter une exception grâce au mot clé throw.

La méthode A pourra alors, à l'aide un try/catch attraper l'exception, et définir un comportement quand celle ci se produit.

Par exemple, si on réalise une méthode de division mathématique, et que l'on essaye de diviser par 0 :

{"language":"application/x-httpd-php","content":"<?php\n\tfunction A()\n\t{\n\t\ttry\n\t\t{\n\t\t\techo \"Le résultat est : \" . B(5,0);\n\t\t}\n\t\tcatch(Exception $e)\n\t\t{\n\t\t\techo \"On ne peut pas diviser par 0 ! \";\n\t\t}\t\n\t}\n\n\tfunction B($divider,$divisor)\n\t{\n\t\tif($divisor == 0)\n\t\t{\n\t\t\tthrow new Exception();\n\t\t}\n\t\treturn $divider/$divisor;\n\t}\n\n\tA();","filename":"exemple"}


Dans cette exemple, la phrase d'erreur "On ne peut pas diviser par 0 ! " va s'afficher à l'écran, car la fonction A a pu attraper l'exception générée par la fonction B.

Mais on ne récupère qu'une exception générique, si plusieurs éléments peuvent générer une exception, comme par exemple, envoyer une lettre en diviseur, on ne saura pas précisément quel est le problème lorsque l'on récupère l'exception dans la fonction A.

les exceptions personnalisées


Avec l'héritage, on peut créer de nouvelles classes qui héritent de la classe Exception, et ainsi avoir des exceptions plus spécifiques. Par exemple :

{"language":"application/x-httpd-php","content":"<?php\n\tclass ZeroDiviserException extends Exception\n\t{\n\t\tpublic function __construct()\n\t\t{\n\t\t\t\n\t\t}\n\t}","filename":"exemple"}


En plus de ça, les exceptions possèdent plusieurs propriétés, dont un message, et un code, que je te propose de surcharger pour qu'ils soient spécifique à cette erreur.

{"language":"application/x-httpd-php","content":"<?php\n\tclass ZeroDiviserException extends Exception\n\t{\n\t\tpublic function __construct($message = \"On ne peut pas diviser par 0 !\")\n\t\t{\n\t\t\tparent::__construct($message, \"0001\");\n\t\t}\n\t}","filename":"exemple"}


Ainsi remonter une nouvelle exception de type ZeroDiviserException précisera un message et un code qui seront exploitable très facilement à travers toute l'application.

Arthur, l'apprenti développeurMais, tu assigne le paramètre message directement dans les parenthèses du constructeur... On peut faire ça?

Oui c'est un paramètre facultatif, avec une valeur prédéfinie, ça va nous permettre d'appeler le constructeur sans passer de paramètres, ce qui créera l'exception avec le message prédéfini, ou bien de lui passer un autre message en paramètre, et dans le cas le message sera écrasé.

L'avantage au final et que l'on peut préciser plusieurs catch à un même try, pour gérer des comportements différents selon les erreurs :

{"language":"application/x-httpd-php","content":"<?php\n\tclass ZeroDiviserException extends Exception\n\t{\n\t\tpublic function __construct($message = \"On ne peut pas diviser par 0 !\")\n\t\t{\n\t\t\tparent::__construct($message, \"0001\");\n\t\t}\n\t}\n\n\tfunction A()\n\t{\n\t\ttry\n\t\t{\n\t\t\techo \"Le résultat est : \" . B(5,0);\n\t\t}\n\t\tcatch(ZeroDiviserException $e)\n\t\t{\n\t\t\techo \"Erreur \" . $e->code . \" : \" . $e->message;\n\t\t}\n\t\tcatch(Exception $e)\n\t\t{\n\t\t\techo \"Une erreur inconnue s'est produite\";\n\t\t}\t\n\t}\n\n\tfunction B($divider,$divisor)\n\t{\n\t\tif($divisor == 0)\n\t\t{\n\t\t\tthrow new ZeroDiviserException();\n\t\t}\n\t\treturn $divider/$divisor;\n\t}\n\n\tA();","filename":""}


Les exceptions du routeur


Voilà tous le concept, maintenant il faut que tu crée les deux exceptions que nous avons utilisé dans le routeur, si tu te rappelles. Je te propose de les mettre dans un nouveau dossier Exception, qui lui même se trouvera dans le dossier Framework.

Arthur, l'apprenti développeurOk c'est un jeu d'enfant

{"language":"application/x-httpd-php","content":"<?php\n\tclass MultipleRouteFoundException extends Exception\n\t{\n\t\tpublic function __construct($message = \"More than 1 route has been found\")\n\t\t{\n\t\t\tparent::__construct($message, \"0001\");\n\t\t}\n\t}","filename":""}


{"language":"application/x-httpd-php","content":"<?php\n\tclass NoRouteFoundException extends Exception\n\t{\n\t\tpublic function __construct($message = \"No route has been found\")\n\t\t{\n\t\t\tparent::__construct($message, \"0002\");\n\t\t}\n\t}","filename":""}


Parfait, il ne nous reste plus qu'à tester tout ça !

Arthur, l'apprenti développeurEt on aura finit???

Non, pas encore, mais tu va voir ça avance à grand pas. J'ai terminé cette partie
Demander de l'assistance