Opérateur de contrôle d'erreur

PHP supporte un opérateur de contrôle d'erreur : l'arobase (@). Lorsque cet opérateur est ajouté en préfixe d'une expression PHP, les diagnostics d'erreur qui peuvent être générés par cette expression seront ignorés.

Si vous avez défini un gestionnaire d'erreurs personnalisé avec la fonction set_error_handler(), alors il sera toujours appelé, mais ce gestionnaire d'erreurs peut (et doit) appeler la fonction error_reporting() qui devra retourner 0 lorsque l'appel qui a émis l'erreur était précédé d'un @.

Si un gestionnaire d'erreur personnalisé est défini avec set_error_handler(), il sera quand même appelé même si le diagnostic a été ignorée, de ce fait le gestionnaire d'erreur personnalisé devrait appeler error_reporting() et vérifier que l'opérateur @ a été utilisé de la manière suivante :

<?php
function my_error_handler($err_no$err_msg$filename$linenum) {
    if (!(
error_reporting() & $err_no)) {
        return 
false// Ignoré
    
}
    
// ...
}
?>

Avertissement

Prior to PHP 8.0.0, the value of the severity passed to the custom error handler was always 0 if the diagnostic was suppressed. This is no longer the case as of PHP 8.0.0.

Tous les messages d'erreur générés par l'expression est disponible dans l'élément "message" du tableau retourné par la fonction error_get_last(). Le résultat de la fonction changera à chaque erreur, aussi, il convient de le vérifier souvent.

<?php
/* Erreur intentionnelle (le fichier n'existe pas): */
$mon_fichier = @file ('non_persistent_file') or
    die (
"Impossible d'ouvrir le fichier : L'erreur est : '" error_get_last()['message'] . "'");

// Cela fonctionne avec n'importe quelle expression, pas seulement les fonctions
  
$value = @$cache[$key];
// la ligne ci-dessus n'affichera pas d'alerte si la clé $key du tableau n'existe pas

?>

Note: L'opérateur @ ne fonctionne qu'avec les expressions. La règle générale est : si il est possible de prendre la valeur de quelque chose alors on peut préfixé l'opérateur @ à celui-ci. Par exemple, il peut être préfixé devant les variables, appels de fonctions, certain appels aux constructions de langages (e.g. include), etc. Il ne peut pas être préfixé devant les définitions de fonctions ou de classes, ou structure conditionnelles tel que if et foreach, etc.

Avertissement

Antérieur à PHP 8.0.0, il était possible pour l'opérateur @ de désactiver les erreurs critiques qui terminait l'exécution du script. Par exemple, préfixer @ à un appel d'une fonction qui n'existe pas, en étant indisponible ou mal orthographiée, causait le script à se terminer sans aucune indication pourquoi.