Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Throw new \Exception(); Oui, mais laquelle ?

Throw new \Exception(); Oui, mais laquelle ?

De l'importance de prendre soin de ses exceptions.

Conférence donné au ForumPHP 2025.

Olivier Dolbeau

October 14, 2024
Tweet

More Decks by Olivier Dolbeau

Other Decks in Programming

Transcript

  1. Yellow Idea Template for LibreOffice Impress. Credit by : @ealita.id,

    2020. Throw new \Exception ; Oui, mais laquelle ?! Olivier Dolbeau https://odolbeau.fr Éleveur d’exceptions en freelance
  2. https://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_d%27exceptions Joker Wikipédia Système de gestion des exceptions […]permet de

    gérer les conditions exceptionnelles pendant l'exécution du programme. Lorsqu'une exception se produit, l'exécution normale du programme est interrompue [...]. Définition
  3. Une exception n’est pas un bug ! L'absence d'un fichier

    utile n'est pas un bogue du programme. Par contre, ne pas gérer son absence en provoquerait un. Précision Joker Wikipédia (2) https://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_d%27exceptions
  4. C’quoi l’but ? Ce sont les exceptions qui vont permettre

    de gérer tous les cas différents du cas nominal. Gérer les « conditions exceptionnelles »
  5. Test (très) difficile Que faire quand : • Les données

    envoyées par un·e utilisateur·ice ne sont pas valides ? • Quand quelqu’un·e appelle mon API sécurisée sans être authentifié·e ? • Quand on essaye de rembourser un paiement qui est déjà remboursé ?
  6. Présentation Une librairie Deux cas de figure Un projet «

    final » • Maîtrise totale du projet • Connaissance des usages • Besoins très évolutifs • Usages possibles potentiellement variés • Besoin(s) souvent figé(s) ou peu évolutif(s)
  7. Anticiper les cas d’erreurs possibles Permettre aux utilisateur·ices de la

    librairie de pouvoir traiter n’importe quel cas d’erreur de notre librairie de la manière qui leur conviendra le mieux. ⚠️ Cela ne signifie pas (forcément) créer une exception différente par erreur possible ! ⚠️ Quel est l’objectif ?
  8. Pour une librairie 3 règles simples 1) Prévoir suffisamment d’exceptions

    pour gérer tous les cas d’erreur. 2) Prévoir une exception (une interface) pour les gouverner toutes. 3) Ne jamais lancer une exception qui ne nous appartient pas.
  9. Anticiper les cas d’erreurs possibles Permettre aux utilisateur·ices de la

    librairie de pouvoir traiter n’importe quel cas d’erreur de notre librairie de la manière qui leur conviendra le mieux. ⚠️ Cela ne signifie pas (forcément) créer une exception différente par erreur possible ! ⚠️ Quel est l’objectif ?
  10. Gérer les cas d’erreurs prévus / utiles Quel est l’objectif

    ? Anticiper tous les cas d’erreur est une perte de temps.
  11. Exceptions d’un projet Comment choisir son exception ? 1) Utiliser

    une exception tierce existante 2) Créer une exception spécifique à mon problème 3) Utiliser une exception PHP
  12. Utiliser une exception tierce existante Pertinent (à peu près) dès

    qu’une exception adaptée existe. Exemples : Doctrine\ORM\EntityNotFoundException Doctrine\ORM\NoResultException Symfony\Component\Validator\Exception\ValidationFailedException Cette option est celle à privilégier ! Exception existante
  13. Créer une exception spécifique à mon problème Pertinent pour gérer

    un cas d’erreur métier anticipé (et si la première option n’est pas possible / suffisante). Exemple : si la clôture d’un compte en banque est impossible car il reste des fonds sur le compte, on peut créer une exception « NonEmptyBankAccountException ». ⚠️ Cette option n’est pas le choix par défaut ! ⚠️ Exception spécifique
  14. Utiliser une exception PHP Exemples : \RuntimeException \LogicException Option à

    privilégier si vous n’avez pas besoin d’une exception spécifique ET que vous n’avez pas trouvé d’exception tierce correspondant à votre cas d’erreur. Exception PHP https://www.php.net/manual/fr/reserved.exceptions.php & https://www.php.net/manual/fr/spl.exceptions.php
  15. Exceptions d’un projet 3 règles simples 1) Réutiliser des exceptions

    qui ne nous appartiennent pas si c’est pertinent 2) Créer uniquement les exceptions nécessaires pour gérer les cas d’erreur prévus 3) Ne pas tout catcher => Les erreurs 500, c’est bien aussi !
  16. Conclusion Une librairie 2 cas, 2 mots, 6 règles Un

    projet « final » GRA-NU-LA-RI-TÉ • Prévoir suffisamment d’exceptions pour gérer tous les cas d’erreur • Prévoir une exception (ou une interface) pour les gouverner toutes • Ne jamais lancer une exception qui ne nous appartient pas PRAG-MA-TIS-ME • Réutiliser des exceptions qui ne nous appartiennent pas si c’est pertinent • Créer uniquement les exceptions nécessaires pour gérer les cas d’erreur prévus • Ne pas tout catcher => Les erreurs 500, c’est bien aussi !