Menu
Coddy logo textTech

Try, Catch, Finally

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 68 sur 91.

Maintenant que vous savez créer et lever des exceptions, vous devez apprendre à les catch. La structure try-catch-finally vous permet de gérer les exceptions avec élégance au lieu de les laisser faire planter votre application.

Placez le code susceptible de lever une exception dans un bloc try, puis gérez l’exception dans un bloc catch :

<?php
class Calculator {
    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new InvalidArgumentException("Cannot divide by zero");
        }
        return $a / $b;
    }
}

$calc = new Calculator();

try {
    echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
    echo "Error: " . $e->getMessage();
}

Sortie :

Error: Cannot divide by zero

Vous pouvez intercepter différents types d’exceptions avec plusieurs blocs catch. PHP les vérifie dans l’ordre, alors placez les exceptions les plus spécifiques en premier :

<?php
try {
    // code risqué
} catch (InvalidArgumentException $e) {
    echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
    echo "Something went wrong: " . $e->getMessage();
}

Le bloc finally s’exécute, qu’une exception ait été levée ou interceptée. Il est idéal pour les tâches de nettoyage, comme la fermeture des connexions :

<?php
try {
    echo "Attempting operation\n";
    throw new Exception("Failed");
} catch (Exception $e) {
    echo "Caught: " . $e->getMessage() . "\n";
} finally {
    echo "Cleanup complete";
}

Sortie :

Attempting operation
Caught: Failed
Cleanup complete

Le bloc finally s’exécute même si vous effectuez un retour depuis les blocs try ou catch, ce qui le rend fiable pour les opérations essentielles de nettoyage.

challenge icon

Défi

Facile

Construisons un système de traitement de fichiers qui montre comment try-catch-finally fonctionne conjointement pour gérer les erreurs avec élégance, tout en garantissant que le nettoyage a toujours lieu.

Vous organiserez votre code sur trois fichiers :

  • FileException.php : créez une classe personnalisée FileException qui étend Exception. Elle représentera les erreurs liées aux fichiers dans votre système.
  • FileProcessor.php : créez une classe FileProcessor qui simule des opérations sur des fichiers. Incluez le fichier FileException. Votre classe doit comporter :
    • Une propriété booléenne privée $isOpen initialisée à false
    • Une méthode open(string $filename): void qui définit $isOpen sur true et affiche "Opening: [filename]". Si le nom de fichier est "invalid.txt", lancez une FileException avec le message "Cannot open file"
    • Une méthode process(): void qui affiche "Processing file...". Si $isOpen vaut false, lancez une RuntimeException avec le message "File not open"
    • Une méthode close(): void qui définit $isOpen sur false et affiche "File closed"
    • Une méthode isOpen(): bool qui renvoie l’état actuel
  • main.php : incluez le fichier FileProcessor. Vous recevrez une entrée : un nom de fichier.

    Créez un FileProcessor et utilisez une structure try-catch-finally pour :

    • Dans le bloc try : appelez open() avec le nom de fichier, puis appelez process()
    • Interceptez d’abord FileException et affichez "File error: [message]"
    • Interceptez RuntimeException et affichez "Runtime error: [message]"
    • Dans le bloc finally : vérifiez si le fichier est ouvert à l’aide de isOpen() et, si c’est le cas, appelez close(). Affichez ensuite "Cleanup complete"

Le bloc finally garantit que le nettoyage est effectué, que les opérations réussissent ou échouent. Ce modèle est essentiel pour gérer des ressources telles que les fichiers, les connexions à des bases de données ou les sockets réseau, pour lesquelles le nettoyage doit avoir lieu quoi qu’il arrive pendant le traitement.

Essayez vous-même

<?php
require_once 'FileProcessor.php';

// Lire l'entrée
$filename = trim(fgets(STDIN));

// TODO: Créer une instance de FileProcessor

// TODO: Utiliser la structure try-catch-finally :
// - Dans le bloc try : appeler open() avec le filename, puis appeler process()
// - Attraper FileException en premier et afficher "File error: [message]"
// - Attraper RuntimeException et afficher "Runtime error: [message]"
// - Dans le bloc finally : vérifier si le fichier est ouvert avec isOpen(), si oui appeler close()
//   Then print "Cleanup complete"

?>
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur PHP en ligne