Exceptions PHP : throw, try/catch, classe personnalisée
Une exception signale qu'une fonction ne peut pas faire son travail : on la lance avec throw, et le code qui sait quoi faire de l'erreur l'attrape avec try/catch.
class ArticleIntrouvable extends Exception { public function __construct(public readonly string $slug) { parent::__construct("Aucun article ne porte le slug « $slug »."); } } /** @param array<string, Article> $articles */ function trouverArticle(array $articles, string $slug): Article { return $articles[$slug] ?? throw new ArticleIntrouvable($slug); } try { echo Page::article(trouverArticle($articles, $slug)); } catch (ArticleIntrouvable) { http_response_code(404); echo Page::introuvable(); }
Dès que throw s'exécute, la fonction s'arrête, et PHP remonte les appels jusqu'au premier catch qui accepte ce type d'exception. Sans catch, le script s'arrête sur une erreur fatale « Uncaught … ». L'intérêt : la fonction qui détecte le problème n'a pas à savoir comment y répondre (page 404, message, journal), et elle n'a pas à renvoyer une valeur bidon comme null ou false que l'appelant oublierait de vérifier.
Une exception personnalisée hérite d'Exception (ou d'une de ses sous-classes) pour donner un nom précis à l'erreur et transporter les informations utiles, ici le slug. On attrape alors exactement ce que l'on sait traiter, et le reste continue de remonter. Depuis PHP 8.0, catch (ArticleIntrouvable) s'écrit sans variable quand on ne s'en sert pas.
2 exercices font travailler cette notion, en écrivant du code dans le navigateur.