74 votes

Supprimer les erreurs avec l'opérateur @ en PHP

À votre avis, est-il toujours valable d'utiliser l'opérateur @ pour supprimer une erreur/d'avertissement en PHP alors que vous pourriez être la manipulation de l'erreur?

Si oui, dans quelles circonstances utilisez-vous?

Les exemples de Code sont les bienvenus.

Edit: Remarque pour repliers. Je ne cherche pas à transformer les rapports d'erreur off, mais, par exemple, la pratique courante est d'utiliser

@fopen($file);

et puis de vérifier par la suite... mais vous pouvez vous débarrasser de l' @ en faisant

if (file_exists($file))
{
    fopen($file);
}
else
{
    die('File not found');
}

ou similaire.

Je suppose que la question est - est-il possible que @ doit être utilisé pour soigner une erreur, qui NE peut pas être traitée de toute autre manière?

125voto

Gerry Points 3954

=================================================
Remarque: tout d'Abord, je me rends compte que 99% des développeurs PHP utilisez la suppression d'erreur de l'opérateur (j'ai utilisé pour être l'un d'eux), donc je m'attends à tout PHP dev qui voit cela de bas de voter de moi, mais s'il vous plaît signet ce de sorte que vous pouvez revenir et de le changer pour un vote dans quelques années, quand vous vous rendez compte que j'avais raison. =================================================

À votre avis, est-il toujours valable d'utiliser l'opérateur @ pour supprimer une erreur/d'avertissement en PHP alors que vous pourriez être la manipulation de l'erreur?

Réponse courte:
PAS de!!!!!!!!!!!!!!!!!!!!

Plus de plus de la réponse correcte:
Je ne sais pas car je ne sais pas tout, mais jusqu'à présent je n'ai pas rencontré de situation où c'était une bonne solution.

Pourquoi c'est mauvais:
Dans ce que je pense est d'environ 7 ans à l'aide de PHP maintenant, je l'ai vu sans fin de débogage souffrance causée par la suppression d'erreur de l'opérateur et n'ai jamais rencontré une situation où c'était inévitable.

Le problème, c'est que le morceau de code que vous la suppression des erreurs, peuvent aujourd'hui la cause de l'erreur que vous voyez; toutefois, lorsque vous modifiez le code qui l'a supprimé la ligne s'appuie sur la, ou de l'environnement dans lequel il s'exécute, puis il ya toutes les chances que la ligne va tenter de sortie d'une erreur tout à fait différent de celui que vous essayez de l'ignorer. Alors comment dépister une erreur qui n'est pas sortie? Bienvenue sur le débogage de l'enfer!

Il m'a fallu plusieurs années pour comprendre comment beaucoup de temps que je perdais tous les deux mois, en raison de la suppression d'erreurs. Le plus souvent (mais pas exclusivement), c'était après l'installation d'un tiers script/app/bibliothèque, qui était exempt d'erreurs dans les développeurs de l'environnement, mais pas le mien, parce que de un php configuration du serveur ou de la différence ou de dépendance manquante qui aurait normalement sortie immédiatement une erreur d'alerte à ce que le problème a été, mais pas quand le dev ajoute la magie @.

Les solutions de rechange (en fonction de la situation et du résultat souhaité):
Gérer l'erreur réelle que vous êtes au courant, de sorte que si un morceau de code qui va provoquer une certaine erreur, il n'est pas exécuté dans ce contexte particulier. Mais je pense que vous obtenez de la présente partie et que vous avez été inquiet à propos de la fin les utilisateurs de voir les erreurs, ce qui est ce que je vais maintenant aborder.

Régulièrement des erreurs, vous pouvez définir un gestionnaire d'erreurs, de sorte qu'ils sont de sortie dans la façon dont vous le souhaitez lorsque c'est à vous de l'affichage de la page, mais caché des utilisateurs finaux et des connectés de sorte que vous savez ce que les erreurs de vos utilisateurs sont de déclenchement.

Pour les erreurs fatales ensemble display_errors à off (votre gestionnaire d'erreur est toujours déclenché) dans votre php ini et activer la journalisation des erreurs. Si vous avez un serveur de développement, ainsi que d'un serveur (que je recommande), cette étape n'est pas nécessaire sur votre serveur de développement, de sorte que vous pouvez toujours effectuer le débogage de ces erreurs fatales, sans avoir à recourir à regarder le fichier journal des erreurs. Il y a même un truc à l'aide de la fonction d'arrêt d'envoyer beaucoup d'erreurs fatales à votre gestionnaire d'erreur.

En résumé:
Veuillez éviter de l'utiliser. Il peut y avoir une bonne raison pour cela, mais je suis encore à voir, donc, jusqu'à ce jour il est de mon avis que l' (@) suppression d'Erreur de l'opérateur est le mal.

Vous pouvez lire mon commentaire sur le Contrôle d'Erreur des Opérateurs de page dans le manuel PHP si vous voulez plus d'info.

Edit: Btw pour le 2 en bas électeurs (3, ce qui est surprenant) jusqu'à présent, il serait grand si vous avez laissé un commentaire. Si je me trompe sur ce ensuite j'aimerais savoir pourquoi. D'autre part, si vous êtes juste en bas à droit de vote de moi parce que je suis arrogant, juste assez. C'est un appel juste, mais s'il vous plaît l'indiquer comme votre raison.

26voto

Paweł Hajdan Points 8004

Je supprimerais l'erreur et m'en occuperais. Sinon, vous pourriez avoir un problème avec TOCTOU (Heure de vérification, heure d'utilisation. Par exemple, un fichier peut être supprimé après que file_exists renvoie true, mais avant la fin du processus).

Mais je ne supprimerais pas simplement les erreurs pour les faire disparaître. Ceux-ci devraient être visibles.

21voto

Jason Cohen Points 36475

Oui, la suppression a du sens.

Par exemple, la commande fopen() renvoie FALSE si le fichier ne peut pas être ouvert. C'est bien, mais cela produit également un message d'avertissement PHP. Souvent, vous ne voulez pas l'avertissement - vous vérifierez vous-même les FALSE .

En fait, le manuel PHP suggère spécifiquement d'utiliser @ dans ce cas!

13voto

dirtside Points 3613

Si vous ne souhaitez pas qu'un avertissement soit émis lors de l'utilisation de fonctions telles que fopen (), vous pouvez supprimer l'erreur mais utiliser des exceptions:

 try {
    if (($fp = @fopen($filename, "r")) == false) {
        throw new Exception;
    } else {
        do_file_stuff();
    }
} catch (Exception $e) {
    handle_exception();
}
 

7voto

ashnazg Points 3038

Je n'ai JAMAIS me permettre d'utiliser le caractère " @ " ... période.

Quand j'ai découvert l'utilisation de '@' dans le code, j'ai ajouter des commentaires à faire flagrants, tant au moment de l'utilisation, et dans le docblock autour de la fonction où il est utilisé. Moi aussi, j'ai été mordu par "à la poursuite d'un fantôme" débogage à cause de ce genre de suppression d'erreur, et j'espère le rendre plus facile pour la personne suivante en mettant en valeur son utilisation quand je le trouve.

Dans le cas où je suis désireux mon propre code pour lancer une Exception si une fonction native PHP rencontre une erreur, et le '@' semble être le moyen le plus facile pour y aller, j'ai à la place choisir de faire quelque chose d'autre qui obtient le même résultat, mais est (à nouveau) flagrants dans le code:

$orig = error_reporting(); // capture original error level
error_reporting(0);        // suppress all errors
$result = native_func();   // native_func() is expected to return FALSE when it errors
error_reporting($orig);    // restore error reporting to its original level
if (false === $result) { throw new Exception('native_func() failed'); }

C'est beaucoup plus le code qui écrit:

$result = @native_func();

mais je préfère faire mes suppression besoin de TRÈS ÉVIDENT, pour l'amour des pauvres de débogage de l'âme qui me suit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X