L'article introuvable

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

Notions abordées : Exceptionthrowtrycatch

Le neveu d'Odette prépare une page « Les articles de Gaston », et il a oublié de tester le null de Redaction::article(). Résultat : Call to a member function versHtmlComplet() on null, une erreur qui arrive loin de sa cause et ne dit pas ce qui manque. Chaque nouvel appel à Redaction::article() devra-t-il penser au null ? Non : quand l'article n'existe pas, Redaction::article() va lancer une exception, et le contrôleur frontal l'attrapera une fois pour toutes.

Votre mission

  1. Dans Redaction::article(), quand aucun article ne correspond, lancez une exception au lieu de renvoyer null : throw new Exception("Aucun article ne porte le slug « $slug ».");, avec use Exception; sous le namespace (voir le Rappel). La méthode renvoie toujours un Article : son type de retour perd son ?.
  2. Dans le gestionnaire des articles, retirez le test du null : il ne sert plus.
  3. Dans le contrôleur frontal, entourez l'appel du gestionnaire d'un try, et attrapez l'exception avec catch (Exception) pour afficher Page::introuvable().

Rappel

Une exception est un objet qui signale un problème. throw la lance : la fonction s'arrête net, puis celle qui l'a appelée, et ainsi de suite, jusqu'à un try { … } catch (Exception $erreur) { … } qui l'attrape. Si personne ne l'attrape, la page plante avec son message. Vous en avez déjà croisé une cousine : Rubrique::from('sport') lance une ValueError : elle se lance et s'attrape avec le même try/catch, mais avec catch (ValueError), car c'est une Error, pas une Exception.

Dans le catch, $erreur->getMessage() donne le message de l'exception. Quand la variable ne sert pas, on peut l'omettre : catch (Exception).

Exception est une classe fournie par PHP, rangée à la racine, sans espace de noms. Dans public/index.php, qui n'a pas d'espace de noms, elle s'écrit telle quelle. Dans Redaction, qui est dans Gazette\Contenu, il faut l'importer avec use Exception;, sinon PHP cherche une classe Gazette\Contenu\Exception.