Une exception à son nom

Exercice 9 sur 9 du chapitre 5 · 150 XP · 4 objectifs vérifiés par des tests

Notions abordées : Héritageextendsparent::Exception personnalisée

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

  1. Dans src/Contenu/ArticleIntrouvable.php, déclarez la classe ArticleIntrouvable, qui hérite de la classe Exception de PHP : class ArticleIntrouvable extends Exception, avec use Exception; sous le namespace.
  2. Son constructeur reçoit le slug (public readonly string $slug) et passe à parent::__construct() le message Aucun article ne porte le slug « $slug »., avec le slug reçu.
  3. Dans Redaction::article(), lancez-la à la place de l'Exception : throw new ArticleIntrouvable($slug);.
  4. Dans le contrôleur frontal, catch (Exception) devient catch (ArticleIntrouvable). Importez-la en haut du fichier avec use Gazette\Contenu\ArticleIntrouvable; : un catch sur 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).