Classes d’exceptions
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 66 sur 91.
En PHP, les exceptions sont des objets utilisés pour signaler qu’un problème est survenu pendant l’exécution. La classe de base de toutes les exceptions est Exception, et comprendre sa structure vous aide à gérer efficacement les erreurs dans vos applications orientées objet.
Lorsque vous lancez une exception, vous créez une instance de la classe Exception (ou d’une sous-classe) avec un message décrivant ce qui s’est mal passé :
<?php
class BankAccount {
public function __construct(private float $balance = 0) {}
public function withdraw(float $amount): float {
if ($amount > $this->balance) {
throw new Exception("Insufficient funds");
}
$this->balance -= $amount;
return $amount;
}
}
$account = new BankAccount(100);
$account->withdraw(150);
Cela produirait une erreur d’exception non interceptée avec le message « Insufficient funds ».
PHP fournit plusieurs classes d’exception intégrées pour différentes situations. InvalidArgumentException signale une entrée incorrecte, RuntimeException indique des erreurs lors de l’exécution, et LogicException représente des erreurs de programmation :
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
Chaque objet exception contient des informations utiles : getMessage() renvoie le message d’erreur, getCode() renvoie un code d’erreur facultatif, et getFile() ainsi que getLine() vous indiquent où l’exception a été levée. L’utilisation de types d’exception spécifiques rend l’intention de votre code plus claire et permet une gestion des erreurs plus précise.
Défi
FacileConstruisons un système de gestion des stocks qui utilise les classes d’exception intégrées de PHP pour signaler différents types de problèmes. Vous créerez un inventaire de produits où les opérations peuvent échouer de manière précise et significative.
Vous organiserez votre code dans trois fichiers :
Product.php: créez une classeProductqui représente un article en stock. Utilisez la promotion des propriétés du constructeur pour un$skupublic (string), un$namepublic (string) et un$quantityprivé (int). Votre classe doit comporter :- Une méthode
getQuantity(): intqui renvoie la quantité actuelle - Une méthode
addStock(int $amount): voidqui augmente la quantité. Si le montant est inférieur à 1, lancez uneInvalidArgumentExceptionavec le message"Amount must be positive" - Une méthode
removeStock(int $amount): voidqui diminue la quantité. Si le montant est inférieur à 1, lancez uneInvalidArgumentExceptionavec le message"Amount must be positive". Si le montant dépasse la quantité actuelle, lancez uneRuntimeExceptionavec le message"Insufficient stock"
- Une méthode
Inventory.php: créez une classeInventoryqui gère une collection de produits. Incluez le fichier Product. Votre classe doit comporter :- Un tableau privé pour stocker les produits indexés par SKU
- Une méthode
addProduct(Product $product): voidqui ajoute un produit. Si un produit avec le même SKU existe déjà, lancez uneLogicExceptionavec le message"Product already exists: [sku]" - Une méthode
getProduct(string $sku): Productqui renvoie un produit par SKU. S’il n’est pas trouvé, lancez uneInvalidArgumentExceptionavec le message"Product not found: [sku]"
main.php: incluez le fichier Inventory. Vous recevrez trois entrées : un SKU, un nom de produit et une opération ("add","remove"ou"duplicate").Créez un
Inventoryet ajoutez un nouveauProductavec le SKU, le nom et une quantité initiale de10indiqués.Selon l’opération :
"add": appelezaddStock(5)sur le produit, puis affichez"Stock updated: [quantity]""remove": appelezremoveStock(15)sur le produit (cela doit lancer une exception)"duplicate": essayez d’ajouter un autre produit avec le même SKU (cela doit lancer une exception)
Lorsqu’une exception est lancée, affichez le nom de sa classe suivi de
": "et du message de l’exception. Utilisez la fonction PHPget_class()pour obtenir le nom de la classe.
Ce défi montre comment différents types d’exceptions communiquent différents types de problèmes — entrées invalides, échecs à l’exécution et erreurs logiques —, ce qui rend la gestion des erreurs de votre code plus précise et plus pertinente.
Essayez vous-même
<?php
require_once 'Inventory.php';
// Lire les entrées
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
try {
// TODO: Créer un Inventory
// TODO: Créer un Product avec le SKU, le name donnés et une quantité initiale de 10
// TODO: Ajouter le product à l'inventory
// TODO: Selon l'opération :
// - "add": Call addStock(5) on the product, then print "Stock updated: [quantity]"
// - "remove": Appeler removeStock(15) sur le product
// - "duplicate": Essayer d'ajouter un autre product avec le même SKU
} catch (Exception $e) {
// TODO: Afficher le nom de la classe de l'exception suivi de ": " et du message
// Hint: Utiliser get_class($e) pour obtenir le nom de la classe
}
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée11Système de types et gestion des erreurs
Déclarations de typesTypes nullablesTypes union et intersectionClasses d’exceptionsHiérarchie d’exceptions personnaliséeTry, Catch, FinallyRécapitulatif - Validateur de formulaires3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne