Gestion des erreurs en PHP : try/catch et techniques avancées

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi la gestion des erreurs est le fondement d'un code PHP fiable



Chaque développeur PHP est confronté à des erreurs. Qu'il s'agisse d'une saisie utilisateur incorrecte, d'une base de données inaccessible ou d'une panne inattendue d'une API, sans une gestion compétente des erreurs, l'application se transforme en une structure fragile qui peut « s'effondrer » à tout moment. La gestion des erreurs en PHP n'est pas seulement un moyen d'éviter l'écran blanc de la mort (WSOD), mais un principe fondamental pour créer des applications web stables, sécurisées et maintenables.



Dans cet article, nous allons décortiquer tous les aspects de la gestion des erreurs en PHP : du mécanisme de base try/catch à la création d'exceptions personnalisées et aux stratégies avancées de journalisation. Vous apprendrez à transformer le chaos des erreurs en un processus contrôlé et prévisible.



Les bases : try, catch, finally et throw



Le bloc try/catch — la première ligne de défense



Le mécanisme des exceptions en PHP est basé sur la construction try/catch. Le code qui peut provoquer une erreur est placé dans le bloc try. Si une exception s'y produit, l'exécution passe immédiatement au bloc catch, où l'erreur est traitée.



<?phptry {    $file = fopen('important_data.txt', 'r');    if (!$file) {        throw new Exception('Impossible d\'ouvrir le fichier');    }    // Travail avec le fichier    fclose($file);} catch (Exception $e) {    echo 'Erreur : ' . $e->getMessage();}?>


Il est important de comprendre : toutes les erreurs en PHP ne sont pas des exceptions. Les avertissements standard (warning) et les notifications (notice) ne génèrent pas automatiquement des exceptions. Pour les intercepter, une configuration spéciale est nécessaire (voir la section « Techniques avancées »).



Le bloc finally — une exécution garantie



Le bloc finally s'exécute toujours, qu'une exception ait été levée ou non. C'est l'endroit idéal pour libérer des ressources : fermer des fichiers, des connexions à la base de données ou libérer de la mémoire.



<?phpfunction processData($data) {    $connection = null;    try {        $connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');        // Exécution des requêtes        return $connection->query($data);    } catch (PDOException $e) {        // Journalisation de l'erreur        error_log('DB Error : ' . $e->getMessage());        return false;    } finally {        // Fermeture de la connexion dans tous les cas        if ($connection) {            $connection = null;        }    }}?>


L'opérateur throw — créer ses propres exceptions



Avec throw, vous pouvez générer des exceptions à n'importe quel point du code. Cela permet de créer des scénarios d'erreur clairs et prévisibles.



<?phpfunction validateAge($age) {    if (!is_numeric($age)) {        throw new InvalidArgumentException('L\'âge doit être un nombre');    }    if ($age < 0 || $age > 150) {        throw new OutOfRangeException('L\'âge est en dehors de la plage autorisée');    }    return true;}

try { validateAge('abc');} catch (InvalidArgumentException $e) { echo 'Erreur de validation : ' . $e->getMessage();} catch (OutOfRangeException $e) { echo 'Plage incorrecte : ' . $e->getMessage();}?>


Classes d'exceptions personnalisées



Les classes d'exceptions standard (Exception, RuntimeException, InvalidArgumentException) couvrent de nombreux scénarios, mais pour les projets complexes, il est préférable de créer ses propres hiérarchies d'exceptions. Cela améliore la lisibilité du code et simplifie le débogage.



Création d'une classe d'exception personnalisée



<?phpclass DatabaseException extends Exception {    private $queryString;        public function __construct($message, $query = '', $code = 0, Throwable $previous = null) {        $this->queryString = $query;        parent::__construct($m                

Blogs

Book Recommendations