Auf eine SO-Frage, die ich hier zu einem Code gestellt habe, bei dem ich mir nicht sicher war, antwortete jemand: "Übrigens, dort gibt es einen schrecklichen Code: er verwendet häufig das Symbol zur Fehlerunterdrückung (@)."
Gibt es einen Grund, warum dies eine schlechte Praxis ist? Mit Dingen wie:
$db=@new mysqli($db_info) or die('Database error');
kann ich nur eine benutzerdefinierte Fehlermeldung anzeigen. Ohne Fehlerunterdrückung würde dann immer noch die typische PHP-Nachricht von:
Warnung : mysqli :: mysqli (): php_network_getaddresses: getaddrinfo fehlgeschlagen: Es ist kein solcher Host bekannt. in irgendeinem \ file \ path in Zeile 6
sowie 'Datenbankfehler'.
Ist die Fehlerunterdrückung immer schlecht, und wenn ja, was genau ist schlecht an den oben genannten?
Update: Der aktuelle Code, den ich verwende, ist:
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>' : ''))
Dadurch werden alle vorherigen Ausgaben entfernt und eine Fehlermeldung angezeigt. Die Tatsache, dass die Fehlermeldung keine Details darüber enthält, was genau passiert ist (was offenbar als Grund für die schlechte Fehlerunterdrückung vorgeschlagen wird), ist irrelevant.
quelle
or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b>' : ''))
Antworten:
Ich denke, Sie tun das Richtige, indem Sie den Fehler unterdrücken, weil Sie Ihre eigene Fehlerbehandlung implementieren.
Es könnte einfacher sein, das Äquivalent beispielsweise in Java zu betrachten. Das Unterdrücken des Fehlers mit
@
ist analog zum Verschlucken einer Ausnahme. Der folgende Code, der Ihrem ähnlich ist, ist sinnvoll:(Nun, in Java möchten Sie nicht, dass die Servlet-Engine abstürzt, aber Sie haben die Idee.)
Dies ist jedoch nicht akzeptabel:
Die meisten PHP-Fehler werden sorglos unterdrückt, analog zu dem letztgenannten Beispiel, daher die knifflige Reaktion auf Ihren Code.
quelle
Fehlerunterdrückung ist schlecht, weil es nicht nur die Informationen verstecken Sie bereits wissen ( etwas schief gelaufen ist ). Es kann auch Informationen verbergen, die für das Debuggen wichtig sind und von denen Sie nichts wissen ( was , wo und warum ).
In diesem speziellen Beispiel ist " Datenbankfehler " keine sehr gute Fehlermeldung. Bei der DB ist etwas schief gelaufen. Nicht sehr aufschlussreich. Die Warnung: mysqli :: mysqli (): php_network_getaddresses: getaddrinfo ist fehlgeschlagen: Es ist kein solcher Host bekannt. in einigen \ file \ path on line 6 "ist eigentlich eine bessere Fehlermeldung. Es gibt Ihnen einen Ort und Grund für das Problem. Sie können sofort mit dem Debuggen beginnen, da der Fehler bereits gefunden wurde.
Natürlich neigen Bibliotheksdesigner manchmal dazu, auf viele irrelevante Warnungen hinzuweisen. Ich kenne PHP nicht gut genug, um zu wissen, ob es eine Möglichkeit zum Filtern von Warnungen gibt, an denen Sie nicht interessiert sind. Die richtige Reaktion auf zu viele Informationen besteht jedoch nicht darin, die Informationsmenge auf Null zu reduzieren , sondern irgendwann irrelevante Teile herauszufiltern. Der
@
Bediener hat diese Granularität nicht (die Devise ist alles oder nichts ) und ist daher kein geeignetes Werkzeug für ein effektives Fehlermanagement.In einigen Fällen wissen Sie, dass ein bestimmter Fehler auftritt und dass die Behebung des eigentlichen Problems teurer ist als das Stummschalten der Nachricht (und die daraus resultierende mögliche Beeinträchtigung). Dies könnte in einem einmaligen Skript der Fall sein, aber wenn Sie Ihre Finger in Ihre Ohren stecken und „ la la la “ sagen, ist dies keine professionelle Antwort auf (potenzielle) Fehler.
quelle
die
und für beide nicht geeignet ist. Die detaillierten Informationen sollten in ein Protokoll aufgenommen werden, unabhängig davon, was Sie dem Benutzer anzeigen .display_errors
aus,log_errors
ein, und Sie können so ziemlich alles tun, um einen Fehler zu entdecken, aber werfen Sie ihn nicht weg.Das Unterdrücken von Fehlern ist schlecht, da es das Problem verbirgt, das uns oftmals gar nicht bewusst ist, und zu unerwartetem Verhalten führen kann, das sich in einigen kritischen Anwendungen als sehr kostspielig erweisen kann, z. B. in Anwendungen, die in den Bereichen Finanzen, Gesundheit und Verteidigung eingesetzt werden.
Es ist auch keine gute Idee, unbehandelte Ausnahmen im Code zu haben und dem Benutzer die tatsächlichen Fehlermeldungen anzuzeigen, da dies zu Sicherheitsproblemen führen kann, da Fehlermeldungen in der Regel viel über Ihren Code verraten, was böswilligen Benutzern und Hackern bei der Manipulation helfen kann das System.
Es empfiehlt sich daher, die Fehler auf verschiedenen Ebenen zu behandeln. Auf höchster Ebene können Sie den Fehler beispielsweise behandeln, indem Sie nur den tatsächlichen Fehler protokollieren und dem Benutzer eine einfache und benutzerfreundliche Meldung anzeigen.
quelle
Ja, der Operator zur Fehlerunterdrückung ist im Allgemeinen eine schlechte Idee.
Sie sollten die Fehlerberichterstattung in der Konfiguration (
php.ini
) verwalten. So können Sie für jede Umgebung eine andere Einstellung wählen (z. B. Warnungen in der Entwicklung belassen und in der Produktion ausblenden).Die einzige Situation, in der die Verwendung
@
sinnvoll sein könnte, besteht darin, eine Bibliothek für andere Entwickler zu entwickeln. Wenn Sie sich freiwillig dafür entscheiden, etwas zu tun, das eine Warnung erzeugt, und die Benutzer Ihrer Bibliothek nicht mit einer Warnung belästigen möchten, die nicht von ihnen abhängt,@
könnte dies eine Lösung sein.Ich kann mir keine andere Verwendung vorstellen.
quelle