Ich muss einige Warnungen abfangen, die von einigen nativen PHP-Funktionen ausgelöst werden, und sie dann verarbeiten.
Speziell:
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
Es wird eine Warnung ausgegeben, wenn die DNS-Abfrage fehlschlägt.
try
/ catch
funktioniert nicht, weil eine Warnung keine Ausnahme ist.
Ich habe jetzt 2 Möglichkeiten:
set_error_handler
scheint übertrieben, weil ich es verwenden muss, um jede Warnung auf der Seite zu filtern (ist das wahr?);Passen Sie die Fehlerberichterstattung / -anzeige so an, dass diese Warnungen nicht auf dem Bildschirm angezeigt werden, und überprüfen Sie dann den Rückgabewert. Wenn dies der
false
Fall ist, wurden keine Datensätze für den Hostnamen gefunden.
Was ist hier die beste Vorgehensweise?
php
error-handling
try-catch
user121196
quelle
quelle
Antworten:
Fehlerbehandlungsroutine festlegen und wiederherstellen
Eine Möglichkeit besteht darin, vor dem Aufruf einen eigenen Fehlerbehandler festzulegen und den vorherigen Fehlerbehandler später mit wiederherzustellen
restore_error_handler()
.Sie können auf dieser Idee aufbauen und einen wiederverwendbaren Fehlerbehandler schreiben, der die Fehler für Sie protokolliert.
Fehler in Ausnahmen verwandeln
Sie können
set_error_handler()
und dieErrorException
Klasse verwenden, um alle PHP-Fehler in Ausnahmen umzuwandeln.Wenn Sie Ihren eigenen Fehlerbehandler verwenden, ist es wichtig zu beachten, dass er die
error_reporting
Einstellung umgeht und alle Fehler (Hinweise, Warnungen usw.) an Ihren Fehlerbehandler weiterleitet. Sie können ein zweites Argumentset_error_handler()
festlegen, um zu definieren, welche Fehlertypen Sie empfangen möchten, oder über... = error_reporting()
die Fehlerbehandlung auf die aktuelle Einstellung zugreifen .Warnung unterdrücken
Eine andere Möglichkeit besteht darin, den Aufruf mit dem Operator @ zu unterdrücken und anschließend den Rückgabewert von zu überprüfen
dns_get_record()
. Ich würde jedoch davon abraten, da Fehler / Warnungen ausgelöst werden, um behandelt und nicht unterdrückt zu werden.quelle
Es stellte sich heraus, dass die Lösung, die wirklich funktioniert, darin besteht, einen einfachen Fehlerbehandler mit
E_WARNING
Parametern festzulegen:quelle
callable
kann hier anstelle von String mit Funktionsdeklaration verwendet werdentrow new \Exception($errstr, $errno);
innerhalb derwarning_handler
Funktion. Vielen Dank.Seien Sie vorsichtig mit dem
@
Bediener - während er Warnungen unterdrückt, werden auch schwerwiegende Fehler unterdrückt. Ich habe viel Zeit damit verbracht, ein Problem in einem System zu debuggen, in dem jemand geschrieben hatte,@mysql_query( '...' )
und das Problem war, dass die MySQL-Unterstützung nicht in PHP geladen wurde und einen stillen schwerwiegenden Fehler verursachte. Es ist sicher für die Dinge, die Teil des PHP-Kerns sind, aber bitte verwenden Sie es mit Vorsicht.Keine weitere Ausgabe - viel Glück beim Debuggen!
Diesmal können wir sehen, warum es fehlgeschlagen ist.
quelle
Ich wollte versuchen, eine Warnung abzufangen, aber gleichzeitig die übliche Warnung / Fehlerprotokollierung beibehalten (z. B. in
/var/log/apache2/error.log
). für die der Handler zurückkehren mussfalse
. Da jedoch die Anweisung "throw new ..." die Ausführung grundsätzlich unterbricht, muss der Trick "Wrap in Function" ausgeführt werden, der auch in:Gibt es eine statische Möglichkeit, eine Ausnahme in PHP auszulösen?
Oder kurz:
BEARBEITEN: Bei näherer Betrachtung stellt sich heraus, dass es nicht funktioniert: Das "
return false && throwErrorException ...
" löst im Grunde genommen keine Ausnahme aus und meldet sich einfach im Fehlerprotokoll an. Wenn Sie denfalse &&
Teil " " wie in "return throwErrorException ...
" entfernen , funktioniert das Auslösen der Ausnahme, aber dann wird das error_log nicht angemeldet. Ich würde dies jedoch weiterhin auf dem Laufenden halten, da ich dieses Verhalten an keiner anderen Stelle dokumentiert habe.quelle
Sie sollten wahrscheinlich versuchen, die Warnung vollständig zu entfernen. Wenn dies jedoch nicht möglich ist, können Sie dem Anruf @ (dh @dns_get_record (...)) voranstellen und dann alle Informationen verwenden, um herauszufinden, ob die Warnung aufgetreten ist oder nicht.
quelle
Normalerweise sollten Sie @ niemals verwenden, es sei denn, dies ist die einzige Lösung. In diesem speziellen Fall sollte zuerst die Funktion dns_check_record verwendet werden, um festzustellen, ob der Datensatz vorhanden ist.
quelle
Das Kombinieren dieser Codezeilen um einen
file_get_contents()
Aufruf einer externen URL hat mir geholfen, Warnungen wie " Fehler beim Öffnen des Streams: Zeitüberschreitung bei Verbindung " viel besser zu verarbeiten:Diese Lösung funktioniert auch im Objektkontext. Sie könnten es in einer Funktion verwenden:
quelle
Wenn dies
dns_get_record()
fehlschlägt, sollte es zurückgegeben werdenFALSE
, damit Sie die Warnung mit unterdrücken@
und dann den Rückgabewert überprüfen können.quelle
Versuchen Sie zu überprüfen, ob ein boolescher Wert zurückgegeben wird. Dann können Sie ihn einfach als Bedingung festlegen. Ich bin auf das oci_execute (...) gestoßen, das mit meinen eindeutigen Schlüsseln einen Verstoß zurückgegeben hat.
quelle
Ordnerstruktur
CustomException.php
Fügen Sie einfach die obige Datei wie folgt in Ihre Skriptdatei ein
index.php
quelle
Ich würde nur empfehlen, @ zu verwenden, um Warnungen zu unterdrücken, wenn es sich um eine einfache Operation handelt (z. B. $ prop = @ ($ high / ($ width - $ depth)); um die Division durch Nullwarnungen zu überspringen). In den meisten Fällen ist es jedoch besser zu handhaben.
quelle