Gestion d'erreurs
Il existe principalement deux types de problèmes pouvant survenir lors de l'exécution du code : les erreurs et les exceptions.
Erreur
Une erreur est un problème qui se produit lors de l'exécution du script et qui empêche le script de s'exécuter correctement. Les erreurs sont généralement dues à des problèmes dans le code ou à des problèmes liés à l'environnement d'exécution.
Types d'erreurs
-
Erreur de syntaxe (Parse error) : Ce type d'erreur se produit lorsque le code PHP n'est pas correctement formé sur le plan syntaxique. Il empêche le script de s'exécuter, car l'interpréteur PHP ne peut pas analyser le code.
<?php if ($test { echo true; } echo 'Next instruction';
-
Erreur fatale (Fatal error) : Ces erreurs arrêtent immédiatement l'exécution du script. Par exemple, lorsqu'une fonction inexistante est appelée.
<?php echo test(); echo 'Next instruction';
-
Avertissement (Warning) : Indique un problème non fatal. Le script continue de s'exécuter malgré l'erreur. Par exemple, accès à une variable non initialisée ou à une clé inexistante dans un tableau.
<?php $array = null; echo $array['key']; echo 'Next instruction';
-
Déprécié (Deprecated) : Ces erreurs indiquent que certaines fonctionnalités, fonctions ou pratiques utilisées dans le script sont obsolètes. Ces éléments sont remplacés par de meilleures alternatives et pourraient être supprimés dans de futures versions de PHP.
<?php new \DateTime(null); echo 'Next instruction';
Gestion
Les erreurs étant principalement liées au code source ou à l'environnement d'exécution, il est de la responsabilité du développeur de prévenir ces problèmes ou de les corriger. Les actions possibles incluent :
- Correction des bugs dans le code.
- Validation des entrées pour éviter des données incorrectes.
- Respect des bonnes pratiques de programmation.
Exception
Une exception est un comportement ou une condition anormale rencontrée par le programme pendant son exécution. Les exceptions sont souvent utilisées pour des cas d'erreur anticipés par le développeur, qui prévoit un code spécifique pour les gérer. Elles surviennent principalement dans des situations imprévues, ce qui les rend difficilement évitables.
Gestion
- Les exceptions sont principalement utilisées dans un contexte de programmation orientée objet.
- Elles sont levées (
throw
) et capturées (catch
) explicitement dans le code. - Il est recommandé de les consigner dans un fichier de log lorsqu'elles surviennent.
En PHP, les mots-clés try
, catch
et throw
sont les éléments clés pour gérer les exceptions. Ce mécanisme offre une gestion des erreurs plus structurée et flexible que les méthodes traditionnelles basées sur les erreurs.
try
- Utilisation : Le bloc
try
encadre le code susceptible de lever une exception. Tout code pouvant générer une exception doit être placé à l'intérieur de ce bloc. - Fonctionnement : Si une exception est levée dans le bloc
try
, l'exécution du code dans ce bloc est immédiatement arrêtée, et PHP passe au premier bloccatch
correspondant.
throw
- Utilisation : Le mot-clé
throw
est utilisé pour lever une exception lorsque le programme rencontre une condition nécessitant une gestion d'erreur particulière. - Fonctionnement : Lorsqu'une exception est levée avec
throw
, l'exécution normale du script est interrompue. PHP recherche ensuite un bloccatch
approprié pour gérer cette exception. Si aucun bloccatch
n'est trouvé, une erreur fatale est générée, et l'exécution du script s'arrête.
catch
- Utilisation : Un bloc
catch
suit un bloctry
et définit comment l'exception doit être gérée. Plusieurs blocscatch
peuvent être utilisés pour traiter différents types d'exceptions. - Fonctionnement : Lorsqu'une exception est levée dans le bloc
try
, PHP cherche un bloccatch
correspondant au type d'exception. Une fois trouvé, le code à l'intérieur du bloccatch
est exécuté pour traiter l'exception.
Exemples
Exemple 1
<?php
try {
// Code that may raise an exception
if (condition) {
throw new Exception('Error message');
}
// Other instructions that will not be executed if an exception is raised
…
} catch (Exception $e) {
// Code to handle the exception
echo "An exception has been caught: {$e->getMessage()}";
}
Dans cet exemple, si condition
est vraie, une exception de type Exception
est levée avec le message "Message d'erreur". Le bloc catch
attrape ensuite cette exception et exécute son code, qui affiche le message d'erreur.
Exemple 2
<?php
// Create an instance of PHPMailer (passing `true` enables exceptions)
$mail = new PHPMailer(true);
try {
…
// Create a message and send it.
$mail->send();
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
Dans cet exemple de code envoyant un email avec la librairie PHPMailer, une exception peut être levée dans plusieurs cas concrets lors de l'exécution de $mail->send()
.
- Problèmes de connexion au serveur SMTP : Si PHPMailer ne parvient pas à se connecter au serveur SMTP configuré (par exemple, en raison d'informations de serveur incorrectes, de problèmes de réseau, ou de problèmes avec le serveur SMTP lui-même), il lèvera une exception.
- Authentification échouée : Si l'authentification au serveur SMTP échoue (mauvais nom d'utilisateur ou mot de passe), une exception sera levée.
- Configuration incorrecte : Des erreurs de configuration dans PHPMailer, telles que des adresses email mal formatées pour l'expéditeur ou le destinataire, peuvent également entraîner des exceptions.
- Problèmes d'envoi de l'email : Des problèmes lors de l'envoi du mail lui-même, tels que des échecs dans la composition de l'email (par exemple, des pièces jointes inexistantes ou des en-têtes incorrects) peuvent provoquer des exceptions.
- Timeouts : Des délais d'attente (timeouts) lors de la communication avec le serveur SMTP peuvent également entraîner des exceptions.
- Erreurs serveur : Toute réponse d'erreur du serveur SMTP (comme les erreurs 4xx ou 5xx) lors de l'envoi de l'email peut déclencher une exception.
Exemple 3
Depuis PHP 7, les erreurs PHP peuvent être capturées de la même manière que les exceptions, grâce à l'introduction de la classe Error
, qui fonctionne de manière similaire à la classe Exception
.
<?php
$result = 10 / 0;
<?php
try {
$result = 10 / 0;
} catch (Error $e) {
// This block captures PHP errors
echo "An error has been captured: {$e->getMessage()}";
}
Fichier de log
La fonction PHP error_log
est un moyen efficace et recommandé pour enregistrer des exceptions et des erreurs en PHP, surtout pour des applications simples à moyennes, ou lorsqu'une solution rapide et facile est nécessaire.
<?php
try {
// Code that can generate an exception
throw new Exception('An error occured');
} catch (Exception $e) {
// Format the error message
$error_msg = "Exception: {$e->getMessage()}";
$error_msg .= " in {$e->getFile()} on line {$e->getLine()}";
// Write the message in the specified log file
error_log($error_msg, 3, '/path/to/file.log');
}
readfile('/path/to/file.log');