2 Stimmen

PHP Escaping-Fehlermeldung mit @

Ich bin derzeit Refactoring einige Code für die Arbeit und ich habe über einige Funktionsaufrufe durch das Symbol "@" vorangestellt kommen. Soweit ich weiß, soll damit eine PHP-Fehlermeldung vermieden werden, wenn der Aufruf fehlschlägt.

Ist so etwas eine gute Praxis? Ich verstehe den Grundgedanken in einer Entwicklungsumgebung, aber wenn die Website in die Produktion überführt wird, sollten dann nicht alle Fehler ordnungsgemäß behandelt werden, anstatt nur zu entgehen?

Die Verwendung dieses Symbols würde daher bedeuten, dass der Entwickler den Code zu einem späteren Zeitpunkt durchsehen muss, um alle Fehlermeldungs-Escapes zu entfernen.

Ich bin mir nicht sicher, ob ich diese Symbole entfernen und einfach einen besseren Weg finden soll, um potenzielle Fehler zu behandeln oder nicht.

Zur Verdeutlichung: Die Funktion, für die dies verwendet wurde, war die native PHP fsockopen() función.

0 Stimmen

5voto

code_burgar Punkte 11551

Das ist wahrscheinlich eine der schlimmsten Praktiken, die man in PHP-Code finden kann. Es sagt dem Interpreter im Grunde, dass er Fehler unterdrücken und einfach versuchen soll, das zu tun, was der Code von ihm verlangt, unabhängig vom Ergebnis.

Eine großartige Möglichkeit, sich selbst und andere Teammitglieder in nächtliche Phantom-Bugjagden zu verwickeln, sobald die App erheblich gewachsen ist.

Try-catch mit benutzerdefinierten Ausnahmebehandlung ist der Weg zu gehen.

2 Stimmen

Es gibt 1 gültige Verwendung: wenn Sie den Rückgabewert überprüfen und den Fehler selbst behandeln.

4voto

Tom Haigh Punkte 56080

Ich denke, es ist manchmal verständlich, @ für den Aufruf von Funktionen wie fsockopen() zu verwenden, denn wenn sie fehlschlagen, geben sie eine Warnung aus und geben auch false zurück.

Es kann Fälle geben, in denen Sie erwarten, dass diese Aufrufe regelmäßig fehlschlagen und daher keine Warnung ausgeben wollen. Natürlich sollten Sie in der Produktion keine Warnungen ausgeben und sie stattdessen protokollieren, aber Sie möchten vielleicht trotzdem den @-Operator verwenden, um zu verhindern, dass Ihre Protokolle voll werden. Sie könnten verhindern, dass Warnungen überhaupt gemeldet werden, indem Sie die Einstellung error_reporting ändern, aber das ist nicht ideal.

0 Stimmen

Wie immer kommt es darauf an, wo und wie es verwendet wird.

3voto

karim79 Punkte 333786

Das nennt man die Fehlerkontrolloperator und ist im Allgemeinen eine sehr beängstigende Sache, die man in Betracht ziehen sollte. Eine Warnung aus dem Handbuch (die Hervorhebungen sind von mir):

Derzeit ist die "@"-Fehlerkontrolle Präfix des Operators wird sogar deaktiviert Fehlerberichte für kritische Fehler die die Ausführung des Skripts beenden wird . Dies bedeutet unter anderem, dass, wenn Sie "@" verwenden, um Fehler aus einer bestimmten Funktion zu unterdrücken und diese entweder nicht verfügbar ist oder falsch eingegeben wurde, wird das Skript wird auf der Stelle sterben, ohne Hinweis darauf, warum .

3voto

Felix Punkte 86442

Die Verwendung des "@"-Operators ist sehr nützlich, wenn Sie wissen dass der Funktionsaufruf fehlschlagen kann, wie z. B. der fsockopen anrufen. Am besten verwenden Sie diese Methode nur, wenn die aufgerufene Funktion häufig fehlschlägt und ein gültiger Fall in Ihrer Anwendung ist. Außerdem sollten Sie auf jeden Fall den Rückgabewert der Funktion nach deren Aufruf überprüfen:

$fp = @fsockopen($hostname, $port);
if ($fp === false) {
    // handle connection failure
}
else {
    // handle connection success
}

Sie sollten zwei Dinge vermeiden:

  1. Keine Überprüfung des Rückgabewerts;
  2. Verwendung des "@"-Operators in Fällen, in denen Sie keinen Fehler erwarten, z. B. beim Öffnen einer lokalen Datei oder beim Senden von Kopfzeilen. Wenn das Öffnen einer lokalen Datei fehlschlägt, ist das es ein Fehler, der ordnungsgemäß behandelt werden sollte.

Nota: Sie sollten sich auch Folgendes ansehen set_error_handler()

0voto

Grain Punkte 553

Wenn Sie Ihre eigenen Fehlerbehandlungsprogramme verwenden, hilft Ihnen der @-Operator nicht weiter, Sie werden immer Fehlerereignisse aus Situationen erhalten, in denen Sie die "Warnung" in Ihrem Code behandeln ... wie bei fsockopen usw.

Auf diese Weise können Sie die Warnung einfach und effektiv unterdrücken:

function renameWithOutExpectedAndSelfHandledErrors( ... ) {

  set_error_handler(function(){}); // deactivate all errors
  $result = rename('not existing','blafussel');
  restore_error_handler(); // restore old error-situation

  return $result;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X