Le neveu d'Odette s'inquiète. Le contrôleur frontal attrape toutes les exceptions : le jour où la gazette aura une base de données et qu'elle tombera en panne, les lecteurs verront « Le facteur l'a perdu » au lieu d'une vraie erreur, et personne ne cherchera la panne. Il faut une exception à part, qui veut dire « cet article n'existe pas », et n'attraper qu'elle.
Votre mission
- Dans
src/Contenu/ArticleIntrouvable.php, déclarez la classeArticleIntrouvable, qui hérite de la classeExceptionde PHP :class ArticleIntrouvable extends Exception, avecuse Exception;sous lenamespace. - Son constructeur reçoit le slug (
public readonly string $slug) et passe àparent::__construct()le messageAucun article ne porte le slug « $slug »., avec le slug reçu. - Dans
Redaction::article(), lancez-la à la place de l'Exception:throw new ArticleIntrouvable($slug);. - Dans le contrôleur frontal,
catch (Exception)devientcatch (ArticleIntrouvable). Importez-la en haut du fichier avecuse Gazette\Contenu\ArticleIntrouvable;: uncatchsur une classe que PHP ne connaît pas n'attrape rien, sans prévenir.
Rappel
extends crée une classe enfant : ArticleIntrouvable reçoit tout ce qu'a Exception (le message, getMessage(), la ligne où elle a été lancée…), et y ajoute son slug. Une ArticleIntrouvable est une Exception : un catch (Exception) l'attraperait aussi. Mais catch (ArticleIntrouvable) n'attrape qu'elle, et laisse passer les autres.
Le constructeur de l'enfant remplace celui du parent. Pour que le message soit quand même rangé, l'enfant appelle le constructeur du parent lui-même, avec parent::__construct($message).