Seb-Info

PHP::Exceptions

PHP::Exceptions

Support de cours

exceptions

 

Cliquez ici pour télécharger le fichier en PDF

Qu’est-ce qu’une exception ?

Une exception est un mécanisme qui signale qu’une erreur s’est produite pendant l’exécution d’un programme.
Lorsqu’une exception est levée (throw), le programme interrompt son exécution normale et cherche un bloc
try…catch pour la gérer.

<?php
$diviseur = 0;
$resultat = 10 / $diviseur; // ⚠️ Warning: Division by zero
echo "Résultat : $resultat";
?>

Sans gestion d’exception, l’erreur provoque un arrêt du script et un message visible par l’utilisateur.


Syntaxe de base try / catch

<?php
try {
    // Code qui peut provoquer une erreur
} catch (Exception $e) {
    // Code exécuté si une exception est levée
}
?>
  • try : contient le code susceptible de provoquer une erreur.
  • catch : capture l’exception pour éviter que le script plante.
  • $e : objet représentant l’exception.
<?php
try {
    $diviseur = 0;
    if ($diviseur == 0) {
        throw new Exception("Division par zéro interdite !");
    }
    $resultat = 10 / $diviseur;
    echo "Résultat : $resultat";
} catch (Exception $e) {
    echo "Erreur : " . $e->getMessage();
}
?>

Les méthodes utiles de l’objet Exception

Méthode Rôle
$e->getMessage() Message d’erreur
$e->getCode() Code numérique associé
$e->getFile() Fichier où l’exception a été levée
$e->getLine() Ligne où l’exception est survenue
$e->getTraceAsString() Trace complète pour le débogage
<?php
try {
    throw new Exception("Un problème est survenu", 1001);
} catch (Exception $e) {
    echo "Message : " . $e->getMessage() . "<br>";
    echo "Code : " . $e->getCode() . "<br>";
    echo "Fichier : " . $e->getFile() . "<br>";
    echo "Ligne : " . $e->getLine() . "<br>";
}
?>

Utilisation concrète avec PDO (base de données)

Exemple : connexion à une base MySQL avec gestion d’erreur propre.

<?php
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$pass = "";

try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connexion réussie";
} catch (PDOException $e) {
    echo "Erreur de connexion : " . $e->getMessage();
}
?>

Pour une requête SQL :

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT * FROM utilisateurs";
    $resultat = $pdo->query($sql);

    foreach ($resultat as $row) {
        echo $row["nom"] . "<br>";
    }

} catch (PDOException $e) {
    echo "Erreur SQL : " . $e->getMessage();
}
?>

Bloc finally

Le bloc finally s’exécute toujours, qu’il y ait une erreur ou non.

<?php
try {
    echo "Ouverture d'un fichier<br>";
    throw new Exception("Problème pendant la lecture !");
} catch (Exception $e) {
    echo "Erreur : " . $e->getMessage() . "<br>";
} finally {
    echo "Fermeture du fichier<br>";
}
?>

Exemple avancé : traiter une erreur MySQL sans l’afficher brute

<?php
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$pass = "";

try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Tentative d'insertion avec un email déjà existant
    $sql = "INSERT INTO utilisateurs (nom, email) VALUES (:nom, :email)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ":nom" => "Dupont",
        ":email" => "dupont@example.com"
    ]);

} catch (PDOException $e) {
    $errorCode = $e->getCode();

    if ($errorCode == 23000) {
        // 23000 = violation contrainte (clé unique)
        echo "L'email existe déjà. Merci d'en choisir un autre.";
        // Ici on pourrait rediriger l'utilisateur ou logger l'erreur
    } else {
        echo "Une erreur technique est survenue. Réessayez plus tard.";
        error_log("Erreur PDO : " . $e->getMessage());
    }
}
?>

Important : Ne jamais afficher directement les messages SQL bruts à l’utilisateur.
Donnez un message clair et loguez les détails pour l’équipe technique.


Bonnes pratiques

  • Utiliser try/catch pour toute interaction avec la base (PDO).
  • Lancer ses propres exceptions avec throw si une situation interdite se produit.
  • Afficher des messages simples pour l’utilisateur final, mais journaliser les détails techniques (fichiers log, Sentry…).
  • Utiliser finally pour libérer les ressources.

 

Ce contenu est réservé aux membres du site. Si vous êtes un utilisateur existant, veuillez vous connecter. Les nouveaux utilisateurs peuvent s'inscrire ci-dessous.

Connexion pour les utilisateurs enregistrés
   
Nouvel utilisateur ?
*Champ requis
Powered by WP-Members