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.