L'erreur supprime-t-elle les mauvaises pratiques?


14

Sur une question SO que j'ai posée ici à propos d'un code dont je n'étais pas sûr, quelqu'un a répondu "BTW, code horrible là-bas: il utilise beaucoup le symbole de suppression d'erreur (@)."

Y a-t-il une raison pour laquelle c'est une mauvaise pratique? Avec des choses comme:

$db=@new mysqli($db_info) or die('Database error');

, cela me permet d'afficher uniquement un message d'erreur personnalisé. Sans suppression d'erreur, il afficherait toujours le message PHP typique de:

Avertissement : mysqli :: mysqli (): php_network_getaddresses: échec de getaddrinfo: aucun hôte de ce type n'est connu. dans un \ file \ path sur la ligne 6

ainsi que «Erreur de base de données».

La suppression des erreurs est-elle toujours mauvaise et, dans l'affirmative, qu'est-ce qui est spécifiquement mauvais dans ce qui précède?

Mise à jour: le code réel que j'utilise est:

or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b><br />Error occurred on line <b>' . __LINE__ . '</b> of <b>' . __FILE__ . '</b>' : ''))

qui supprime toutes les sorties précédentes et affiche un message d'erreur. Par conséquent, le fait que le message d'erreur ne contienne pas de détails sur ce qui s'est spécifiquement produit (ce que les gens semblent suggérer comme une raison pour laquelle la suppression des erreurs est mauvaise) n'est pas pertinent.


9
Portez-vous les yeux bandés pendant que vous conduisez de mauvaises pratiques?
Damien Roche

Comment cela pourrait-il être une question sérieuse? Je suppose que si vous aimez écrire du code qui prend des heures à déboguer, la suppression des erreurs serait une bonne chose. Pensez-y, votre application échoue, corrompt les données ... et vous ne voulez pas savoir pourquoi ni où dans le code. Quand serait-ce une bonne idée? Vous devez inviter vos amis à effectuer une fête de couverture sur vous ... cela suit la même logique.
Some Free Mason

1
@SomeFreeMason Si j'ai besoin de déboguer, je définirais simplement $ debug_mode sur TRUE, car le code réel que j'utilise est:or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b>' : ''))

@Paradoxical: Je me rends compte que l'état de la gestion des exceptions / erreurs en PHP est un peu FUBAR, mais vous savez que vous pouvez désactiver l'affichage visuel des erreurs dans votre configuration PHP, non?
Phoshi

@Phoshi, malheureusement, le service d'hébergement que j'utilise ne me donne pas accès à php.ini

Réponses:


14

Je pense que vous faites la bonne chose en supprimant l'erreur, car vous implémentez votre propre gestion des erreurs.

Il pourrait être plus facile de considérer l'équivalent, par exemple, en Java. La suppression de l'erreur en utilisant @est analogue à la déglutition d'une exception. Le code suivant, similaire au vôtre, est raisonnable:

try {
    db = new MySQLi(dbInfo);
} catch (SQLException connectionFailure) {
    die("Database error");
}

(Eh bien, en Java, vous ne voudriez pas que le moteur de servlet meure, mais vous avez compris.)

Cependant, ce n'est pas acceptable:

try {
    db = new MySQLi(dbInfo);
} catch (Exception e) {
}

La plupart des suppressions d'erreurs PHP se font négligemment, comme dans ce dernier exemple, d'où la réaction instinctive contre votre code.


3
Je n'appellerais pas intercepter l'exception et simplement arrêter l'exécution pour la "gérer". Si vous pouvez résoudre le problème, tant mieux, faites-le. Si vous ne pouvez pas, qu'est-ce que vous faites pour l'attraper? C'est pour cela que nous avons des gestionnaires d'exceptions de niveau supérieur. Attraper des exceptions dans ce cas, c'est simplement vous assurer que le code de gestion des erreurs est éparpillé partout dans votre base de code.
Phoshi

7

La suppression des erreurs est mauvaise, car elle ne masque pas seulement les informations que vous connaissez déjà ( quelque chose s'est mal passé). Il peut également masquer des informations vitales pour le débogage dont vous n'êtes pas au courant ( quoi , et pourquoi ).

Dans cet exemple spécifique, « Erreur de base de données » n'est pas un très bon message d'erreur. Quelque chose s'est mal passé avec la DB. Pas très instructif. Le message " Avertissement: mysqli :: mysqli (): php_network_getaddresses: getaddrinfo a échoué: aucun hôte de ce type n'est connu. dans certains \ file \ path sur la ligne 6 "est en fait un meilleur message d'erreur. Il vous donne un emplacement et une raison pour le problème. Vous pouvez sauter directement et commencer le débogage, car l'erreur a déjà été localisée.

Bien sûr, les concepteurs de bibliothèques ont parfois tendance à afficher de nombreux avertissements non pertinents. Je ne connais pas suffisamment PHP pour savoir s'il a un moyen de filtrer les avertissements qui ne vous intéressent pas. Je sais que la lecture d'une trace de pile de cent lignes n'est pas très éclairante. Mais la réponse correcte à trop d'informations n'est pas de réduire la quantité d'informations à zéro , mais de filtrer les parties non pertinentes à un moment donné. L' @opérateur n'a pas cette granularité (sa devise est tout ou rien ), et n'est donc pas un outil approprié pour une gestion efficace des erreurs.

Il y a des cas où vous savez qu'une certaine erreur se produira et que la résolution du problème réel est plus coûteuse que la réduction au silence du message (et la souffrance potentielle de cela). Cela pourrait être le cas dans un script unique, mais enfoncer vos doigts dans vos oreilles et faire « la la la » n'est pas une réponse professionnelle aux bugs (potentiels).


5
Vous ne voulez pas dire à vos utilisateurs l'erreur exacte. Vous les informez que l'erreur est de votre côté et que vous y travaillez. Vous pouvez consigner les erreurs sur votre serveur et configurer des alertes pour que vous en soyez automatiquement informé, mais il n'y a aucune raison d'afficher ces erreurs à l'utilisateur.
Jeroen Vannevel

1
Sur un site en direct, il vaudrait sûrement mieux qu'un message d'erreur que l'utilisateur typique puisse comprendre soit affiché, plutôt que "quelques déchets techniques sur un mysqli, quel qu'il soit", cependant? Si j'essaie de le déboguer, je supprimerais la suppression des erreurs, mais dans un site en direct, je ne suis pas d'accord pour que l'erreur complète soit affichée.

3
@Paradoxical Sur un site sérieux, vous n'afficheriez pas un message d'erreur comme "erreur de base de données" et rien d'autre. Vous afficheriez une page générique "erreur de serveur interne" avec beaucoup de peluches supplémentaires, de style, de pied de page, etc. qui diene convient pas non plus. Et les informations détaillées doivent être enregistrées dans un journal, indépendamment de ce que vous montrez à l'utilisateur .

1
N'y a-t-il aucun moyen de présenter un message convivial à l'écran et d'écrire le message technique dans un fichier journal?
FrustratedWithFormsDesigner

3
display_errorsoff, log_errorson, et vous êtes à peu près prêt, faites comme bon vous semble pour détecter une erreur, mais ne les jetez pas.
Wrikken

0

La suppression des erreurs est mauvaise car elle cache le problème, dont nous ne sommes même pas souvent conscients et cela peut entraîner un comportement inattendu qui peut s'avérer très coûteux dans certaines applications critiques, par exemple dans les applications utilisées dans les domaines financier, de la santé et de la défense.

Ce n'est également pas une bonne idée d'avoir des exceptions non gérées dans le code et d'afficher les messages d'erreur réels à l'utilisateur car cela peut entraîner des problèmes de sécurité car les messages d'erreur révèlent généralement beaucoup de choses sur votre code, ce qui peut aider les utilisateurs malveillants et les pirates à manipuler le système.

Ainsi, la bonne pratique consiste à gérer les erreurs à différents niveaux, par exemple au niveau le plus élevé, vous pouvez gérer l'erreur en enregistrant simplement l'erreur réelle et en affichant un message simple et convivial à l'utilisateur.


0

Oui, l'opérateur de suppression d'erreur est généralement une mauvaise idée.

Vous devez gérer les rapports d'erreurs dans la configuration ( php.ini). Vous pouvez donc choisir un paramètre différent pour chaque environnement (par exemple, laisser des avertissements en développement et les masquer en production).

La seule situation où l'utilisation @pourrait avoir un sens est lorsque vous développez une bibliothèque pour d'autres développeurs. Si vous choisissez volontairement de faire quelque chose qui génère un avertissement et que vous ne voulez pas ennuyer les utilisateurs de votre bibliothèque avec un avertissement qui ne dépend pas d'eux, cela @pourrait être une solution.

Je ne pense à aucune autre utilisation.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.