Les erreurs de diagnostic

Les erreurs de diagnostic, aussi appelĂ©es erreurs traditionnelles, servent Ă  signaler un certain nombre de conditions diffĂ©rentes, et peuvent ĂȘtre affichĂ©es et/ou enregistrĂ©es dans un journal selon les besoins. Par dĂ©faut, PHP signale tous les diagnostics. (AntĂ©rieurement Ă  PHP 8.0.0, les diagnostics E_NOTICE et E_DEPRECATED n'Ă©taient pas signalĂ©s par dĂ©faut.)

Contrairement aux erreurs Throwable, la plupart des erreurs de diagnostic n'interrompent pas le flux normal d'exécution. Les diagnostics fatals, tels que E_ERROR, terminent le script.

Les diagnostics qui sont signalés et ceux qui sont ignorés sont contrÎlés par la directive php.ini error_reporting, ou lors de l'exécution du script en appelant error_reporting(). Il est fortement recommandé de configurer la directive, car certaines erreurs peuvent se produire avant que l'exécution du script ne commence.

Note:

Dans un environnement de dĂ©veloppement, la directive error_reporting devrait toujours ĂȘtre configurĂ©e avec E_ALL, afin d'ĂȘtre informĂ© et de corriger les problĂšmes relevĂ©s par PHP. En production, le niveau de verbositĂ© peut ĂȘtre rĂ©duit Ă  E_ALL & ~E_NOTICE & ~E_DEPRECATED, mais dans de nombreux cas E_ALL reste appropriĂ©, car il peut avertir en avance de problĂšmes potentiels.

Ce qu'il advient des diagnostics dĂ©pend de deux autres directives php.ini. display_errors dĂ©termine si le diagnostic est affichĂ© dans la sortie du script. Ceci devrait toujours ĂȘtre dĂ©sactivĂ© dans un environnement de production, car la sortie peut contenir des informations confidentielles, telles que les mots de passe de base de donnĂ©es. Il est cependant souvent utile de l'activer lors du dĂ©veloppement, car cela assure un signalement immĂ©diat des problĂšmes.

En plus d'afficher les erreurs, PHP peut enregistrer les diagnostics lorsque la directive log_errors est activĂ©e. Tous les diagnostics sont alors enregistrĂ©s dans le fichier ou le syslog dĂ©fini par error_log. Ceci peut ĂȘtre extrĂȘmement utile dans un environnement de production, car les diagnostics sont enregistrĂ©s lorsqu'ils se produisent, et des rapports peuvent ensuite ĂȘtre gĂ©nĂ©rĂ©s Ă  partir de ces journaux.

Les diagnostics individuels peuvent ĂȘtre supprimĂ©s Ă  l'aide de l'opĂ©rateur @.

Avertissement

Antérieurement à PHP 8.0.0, il était possible de supprimer des diagnostics critiques qui terminaient l'exécution du script PHP.

Note:

D'une version de PHP Ă  l'autre, des diagnostics peuvent ĂȘtre ajoutĂ©s, supprimĂ©s, avoir leur niveau de gravitĂ© modifiĂ© ou ĂȘtre Ă©levĂ©s au rang d'erreur Throwable.

Gestionnaire de diagnostics défini par l'utilisateur

Si la gestion des diagnostics par dĂ©faut de PHP ne convient pas, il est possible de remplacer le gestionnaire par dĂ©faut par un gestionnaire personnalisĂ©, dĂ©fini avec set_error_handler(). Certains diagnostics, tels que E_ERROR et E_PARSE, ne peuvent pas ĂȘtre gĂ©rĂ©s de cette maniĂšre (voir set_error_handler() pour la liste complĂšte). Les autres peuvent ĂȘtre gĂ©rĂ©s de diverses façons. Par exemple, ceci peut servir Ă  afficher une page d'erreur personnalisĂ©e Ă  l'utilisateur, puis Ă  signaler l'erreur de façon plus directe que par un journal, comme en envoyant un courriel.

Un autre usage typique consiste à élever les erreurs de diagnostic au rang d'exceptions avec ErrorException.

Exemple #1 Élever les erreurs de diagnostic au rang d'exceptions

<?php
function exceptions_error_handler($severity, $message, $filename, $lineno) {
    if (error_reporting() & $severity) {
        throw new ErrorException($message, 0, $severity, $filename, $lineno);
    }
}

set_error_handler('exceptions_error_handler');

Note:

Il est important de vérifier que le niveau de gravité est inclus dans la liste actuelle des diagnostics signalables, sans quoi l'opérateur @ ne fonctionnera plus, car une exception serait lancée pour un diagnostic supprimé.

Historique

Version Description
8.5.0 Les erreurs fatales (comme un temps d'exécution maximal dépassé) incluent désormais une trace d'appels dans leur message d'erreur.
add a note

User Contributed Notes

There are no user contributed notes for this page.