Créer des exceptions personnalisées
Étendre la classe Exception pour créer des types d’erreurs propres à votre domaine.
Créer des exceptions personnalisées est une leçon PHP Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage PHP Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours PHP Academy comprend 4 leçons au total.
Pourquoi utiliser des exceptions personnalisées ?
Les exceptions personnalisées vous permettent de :
- Distinguer les erreurs de votre application des erreurs PHP génériques
- Transporter des données propres au domaine (identifiant de commande, identifiant utilisateur, etc.)
- Intercepter des types d'erreur précis à différents niveaux
- Créer des hiérarchies d'erreurs explicites et documentées par le code
Étendre Exception
Créez une exception personnalisée en étendant la classe de base Exception :
<?php
class ValidationException extends \Exception
{
private array $errors;
public function __construct(array $errors, string $message = '', int $code = 0)
{
$this->errors = $errors;
parent::__construct($message ?: implode(', ', $errors), $code);
}
public function getErrors(): array
{
return $this->errors;
}
}Utiliser une exception personnalisée
Lancez et interceptez votre exception personnalisée :
<?php
function createUser(array $data): void {
$errors = [];
if (empty($data['email'])) $errors[] = 'Email required';
if (empty($data['name'])) $errors[] = 'Name required';
if ($errors) {
throw new ValidationException($errors);
}
// save user...
}
try {
createUser([]);
} catch (ValidationException $e) {
foreach ($e->getErrors() as $err) {
echo '- ' . $err . PHP_EOL;
}
}Conception d'une hiérarchie d'exceptions
Concevez une hiérarchie adaptée à votre domaine :
<?php
// Base exception for your app
class AppException extends \RuntimeException {}
// Domain-specific exceptions
class NotFoundException extends AppException {}
class AuthException extends AppException {}
class PaymentException extends AppException {}
// Specific payment errors
class InsufficientFundsException extends PaymentException {
public function __construct(public readonly float $balance, public readonly float $required) {
parent::__construct("Insufficient funds: have $balance, need $required");
}
}Intercepter selon la hiérarchie
Interceptez une classe de base pour gérer toutes les exceptions dérivées :
<?php
try {
processPayment($order);
} catch (InsufficientFundsException $e) {
echo 'Low balance: need ' . $e->required;
} catch (PaymentException $e) {
echo 'Payment failed: ' . $e->getMessage();
} catch (AppException $e) {
echo 'App error: ' . $e->getMessage();
} catch (\Throwable $e) {
// Last resort
error_log($e);
}Ajouter du contexte aux exceptions
Enrichissez les exceptions avec des données supplémentaires pour faciliter le débogage :
<?php
class HttpException extends \RuntimeException
{
public function __construct(
private int $statusCode,
string $message = '',
?\Throwable $previous = null
) {
parent::__construct($message, $statusCode, $previous);
}
public function getStatusCode(): int
{
return $this->statusCode;
}
}Exemple d'exception HTTP
Utiliser l'exception HTTP dans une application web :
<?php
try {
$user = findUserById($id);
if (!$user) throw new HttpException(404, 'User not found');
if (!$user->canAccess($resource)) {
throw new HttpException(403, 'Access denied');
}
} catch (HttpException $e) {
http_response_code($e->getStatusCode());
echo json_encode(['error' => $e->getMessage()]);
}Exceptions fondées sur une interface
Utilisez des interfaces pour regrouper des classes d'exception sans lien de parenté :
<?php
interface UserFacingException
{
public function getUserMessage(): string;
}
class ValidationException extends \Exception implements UserFacingException
{
public function getUserMessage(): string
{
return 'Please check your input: ' . $this->getMessage();
}
}
// In controller:
catch (UserFacingException $e) {
echo $e->getUserMessage();
}Modèle du constructeur nommé
Utilisez des méthodes fabrique statiques pour les scénarios d'exception courants :
<?php
class OrderException extends \RuntimeException
{
public static function notFound(int $id): self
{
return new self("Order #$id not found", 404);
}
public static function alreadyShipped(int $id): self
{
return new self("Order #$id already shipped", 409);
}
}
throw OrderException::notFound($orderId);Sérialiser les exceptions
Convertissez les données d'une exception en tableau pour la journalisation ou les réponses d'API :
<?php
function exceptionToArray(\Throwable $e): array {
return [
'type' => get_class($e),
'message' => $e->getMessage(),
'code' => $e->getCode(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
'previous' => $e->getPrevious()
? exceptionToArray($e->getPrevious())
: null,
];
}Bonnes pratiques pour les exceptions personnalisées
Recommandations pour concevoir des exceptions personnalisées :
- Étendez
RuntimeExceptionpour les situations inattendues - Étendez
LogicExceptionpour les erreurs de programmation (arguments non valides) - Ne créez pas une classe d'exception pour chaque message possible — utilisez plutôt des codes
- Conservez les noms de classes d'exception en PascalCase et terminez-les par Exception
- Documentez les exceptions que chaque méthode peut lancer
Vérification rapide
De quelle classe de base PHP faut-il hériter pour créer une exception personnalisée représentant une erreur logique dans votre code ?
Récapitulatif : exceptions personnalisées
Résumé des exceptions personnalisées :
- Étendre
Exceptionou une sous-classe - Ajouter des propriétés et des méthodes propres au domaine
- Concevoir des hiérarchies — intercepter le parent pour intercepter tous les enfants
- Utiliser des interfaces pour regrouper des exceptions sans lien de parenté
- Utiliser des constructeurs nommés statiques pour plus de clarté
- Toujours appeler
parent::__construct()
Questions Fréquemment Posées
La leçon « Créer des exceptions personnalisées » est-elle gratuite ?
Oui — le texte complet de « Créer des exceptions personnalisées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours PHP Academy, passe à CoddyKit PRO. Le cours PHP Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Créer des exceptions personnalisées » ?
Étendre la classe Exception pour créer des types d’erreurs propres à votre domaine. Tu pratiques PHP Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer PHP Academy ?
Aucune expérience préalable n'est requise. PHP Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Créer des exceptions personnalisées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon PHP Academy ?
Oui. Chaque leçon PHP Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Types d’erreurs PHP et signalement
- Try, Catch et Finally
- Créer des exceptions personnalisées
- Journalisation des erreurs et bonnes pratiques