error_get_last()
Découvrez la fonction error_get_last() en PHP : comment inspecter la dernière erreur enregistrée, son type, son message, son fichier et sa ligne.
La gestion des erreurs est une partie importante de la programmation PHP, car des erreurs peuvent survenir à tout moment pendant l'exécution. La fonction error_get_last() est une fonction PHP intégrée qui vous permet d'inspecter la dernière erreur enregistrée par PHP — son type, son message, son fichier et sa ligne — afin de la journaliser ou d'y réagir dans le code. Ce chapitre explique ce que la fonction retourne, quand elle retourne null, les types d'erreurs qu'elle capture ou non, et comment l'utiliser correctement en PHP moderne.
Ce que retourne error_get_last()
error_get_last() ne prend aucun argument et retourne des informations sur la dernière erreur déclenchée par PHP lors de la requête en cours. La valeur de retour est l'une des deux suivantes :
- Un array associatif avec quatre clés, si une erreur s'est produite.
null, si aucune erreur n'a encore été enregistrée.
L'array a la forme suivante :
[
'type' => 2, // int: the error level (E_WARNING here)
'message' => 'fopen(...): ...', // string: the error description
'file' => '/path/to/script.php', // string: file where the error happened
'line' => 12, // int: line number where it happened
]L'élément type est un entier correspondant à l'une des constantes de niveau d'erreur de PHP — par exemple E_WARNING (2), E_NOTICE (8), E_USER_WARNING (512), ou E_DEPRECATED. Consultez la référence des erreurs PHP pour la liste complète.
Ce qu'elle capture et ce qu'elle ne capture pas
C'est la partie que les gens comprennent mal, il vaut donc la peine d'être précis :
- Elle capture les erreurs, avertissements, notices et dépréciations signalés — tout ce qui transite par le mécanisme d'erreur normal de PHP, y compris ceux déclenchés avec
trigger_error(). - Elle ne capture pas les exceptions. En PHP moderne (7.0+), de nombreuses défaillances lèvent des exceptions au lieu de déclencher des erreurs — par exemple, la division et le modulo par zéro lèvent
DivisionByZeroError, et non un avertissement. Ceux-ci doivent être gérés avectry/catch, eterror_get_last()ne les verra pas. - Elle ne voit que les erreurs qui sont effectivement signalées. Si un niveau d'erreur est filtré par
error_reporting(), il n'apparaîtra pas. Activezerror_reporting(E_ALL)lors du débogage pour qu'aucune erreur ne soit silencieusement ignorée.
De ce fait, error_get_last() est la plus utile juste après une fonction intégrée qui signale un échec par un avertissement (comme fopen(), file_get_contents(), ou unlink()), et à l'intérieur d'une fonction de fermeture personnalisée pour capturer une erreur fatale qui a mis fin à la requête.
Exemples
Lire le dernier avertissement d'un fopen() échoué
Des fonctions comme fopen() retournent false et déclenchent un E_WARNING en cas d'échec. L'opérateur @ supprime l'affichage de l'avertissement, tout en permettant à error_get_last() de le lire :
<?php
error_reporting(E_ALL);
$handle = @fopen("/no/such/file.txt", "r");
if ($handle === false) {
$error = error_get_last();
echo "Type: " . $error['type'] . "\n";
echo "Message: " . $error['message'] . "\n";
echo "Line: " . $error['line'] . "\n";
}
?>Résultat :
Type: 2
Message: fopen(/no/such/file.txt): Failed to open stream: No such file or directory
Line: 4Le type vaut 2, qui est la valeur de la constante E_WARNING, et le message provient directement de fopen().
Capturer une erreur que vous déclenchez vous-même
Vous pouvez enregistrer votre propre erreur avec trigger_error() puis la relire :
<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
trigger_error("Invalid configuration value", E_USER_WARNING);
$error = error_get_last();
echo "Message: " . $error['message'] . "\n";
echo "Type: " . $error['type'] . "\n"; // 512 = E_USER_WARNING
?>Résultat :
Message: Invalid configuration value
Type: 512Quand aucune erreur ne s'est produite
Si rien ne s'est mal passé, la fonction retourne null, donc vérifiez toujours avant de lire les clés de l'array :
<?php
$error = error_get_last();
var_dump($error); // NULL — guard against this before using $error['message']
?>Résultat :
NULLPièges courants
- Vérifiez toujours que le résultat n'est pas null (
if ($error !== null)) avant d'accéder à$error['message'], sinon vous déclencherez un nouvel avertissement « trying to access array offset on null ». - La division par zéro n'est plus un avertissement. Utilisez
try/catchpourDivisionByZeroError;error_get_last()ne le signalera pas. - Pour une journalisation programmatique plutôt qu'une inspection, envisagez d'associer cette fonction à
error_log()ou à un gestionnaire personnalisé enregistré viaset_error_handler().
Conclusion
error_get_last() vous donne le type, le message, le fichier et la ligne de la dernière erreur enregistrée par PHP, ou null s'il n'y en a pas eu. Faites-y appel juste après une fonction intégrée qui échoue avec un avertissement, ou à l'intérieur d'une fonction de fermeture — et n'oubliez pas que les exceptions (y compris la division par zéro en PHP moderne) nécessitent try/catch à la place.