Aller au contenu principal

Les exceptions

Notions théoriques

Dans le monde réel, les erreurs sont inévitables. Dans le monde de la programmation, c'est la même chose. Les exceptions en PHP sont un moyen de gérer les erreurs qui peuvent survenir lors de l'exécution d'un programme.

info

Une exception est simplement une "exception" à l'exécution normale du programme.

Lorsqu'une erreur se produit, une exception est "levée" (ou "throw" en anglais).

Si l'exception n'est pas "attrapée" (ou "catch" en anglais), le programme s'arrête et une erreur est affichée.

Pour attraper une exception, nous utilisons un bloc try/catch.

Le code dans le bloc try est exécuté

  • et si une exception est levée,
  • l'exécution du programme passe au bloc catch, où l'exception est traitée.

Exemple pratique

function checkStrength($strength) {
if($strength < 0) {
throw new Exception('La force du guerrier ne peut pas être négative');
}
}

try {
// Code qui peut lever une exception
$fighterStrength = -5; // Exemple de force négative
checkStrength($fighterStrength);
echo "La force du guerrier est valide.";
} catch(Exception $e) {
// Code qui est exécuté si une exception est attrapée
echo 'Erreur : ' . $e->getMessage();
}

Dans cet exemple, si la force du guerrier est négative:

une exception est levée avec le message "La force du guerrier ne peut pas être négative".

Si cette exception est attrapée, le message d'erreur est affiché à l'utilisateur.

Test de mémorisation/compréhension


Que fait le mot-clé `throw` en PHP ?


Qu'est-ce qu'un bloc `try` en PHP ?


Qu'est-ce qu'un bloc `catch` en PHP ?


Que fait la méthode `getMessage()` sur un objet Exception en PHP ?


Que se passe-t-il si une exception est levée mais non attrapée en PHP ?



TP pour réfléchir et résoudre des problèmes

Objectif du TP

Dans ce TP, nous allons ajouter une gestion des erreurs à notre fonction addFighter(). Nous allons vérifier que la force et la défense du guerrier sont des nombres positifs et lever une exception si ce n'est pas le cas.

Étapes à suivre

  1. Placez vous dans votre répertoire tp_game (dans "Documents").

  2. Dans votre fichier main.php, il y a déjà une fonction addFighter() qui prend en paramètres le nom, la force et la défense d'un guerrier.

    function addFighter($name, $strength, $defense) {

    }
  3. **Ajoutez un bloc try/catch autour des lignes :

    • $dbh = new PDO ...
    • ...
    • $stmt->execute();
  4. Dans le bloc catch, affichez un message d'erreur clair (avec le message de l'exception) à l'utilisateur.

  5. Mettre un n° de port MySQL/MariaDB inaccessible, par exemple port=3310), afin de générer une erreur de connexion.

  6. Lancez votre programme principal pour tester votre fonction addFighter().

    Par exemple :

    ...
    print("Démarrage du programme" . "\n");
    addFighter("Joueur 4", 90, 80);
    addFighter("Joueur 5", 95, 85);
    addFighter("Joueur 6", 88, 82);
    addFighter("Joueur 7", 100, 100);
    print("Fin du programme" . "\n");
Une solution