practice - unhandled exception php




Kann ich versuchen/eine Warnung abfangen? (6)

Die Lösung, die wirklich funktioniert, stellte sich als einfacher Fehlerbehandler mit dem E_WARNING Parameter heraus:

set_error_handler("warning_handler", E_WARNING);
dns_get_record(...)
restore_error_handler();

function warning_handler($errno, $errstr) { 
// do something
}

Ich muss einige Warnungen einfangen, die von einigen php nativen Funktionen geworfen werden und sie dann behandeln.

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, da eine Warnung keine Ausnahme darstellt.

Ich habe jetzt 2 Möglichkeiten:

  1. set_error_handler scheint übertrieben zu sein, weil ich es verwenden muss, um jede Warnung auf der Seite zu filtern (ist das wahr?);

  2. Passen Sie die Fehleranzeige / -anzeige so an, dass diese Warnungen nicht auf dem Bildschirm angezeigt werden, und überprüfen Sie dann den Rückgabewert. Wenn es false , werden keine Datensätze für Hostname gefunden.

Was ist die beste Vorgehensweise hier?


Ich würde nur empfehlen, @ zu verwenden, um Warnungen zu unterdrücken, wenn es sich um eine direkte Operation handelt (zB $ prop = @ ($ high / ($ width - $ depth)); um Warnungen durch Division durch Null zu überspringen). In den meisten Fällen ist es jedoch besser zu handhaben.


Normalerweise sollten Sie niemals @ verwenden, es sei denn, dies ist die einzige Lösung. In diesem speziellen Fall sollte die Funktion dns_check_record zuerst verwendet werden, um zu wissen, ob der Datensatz existiert.


Sie sollten wahrscheinlich versuchen, die Warnung vollständig zu entfernen, aber wenn das nicht möglich ist, können Sie den Anruf mit @ voranstellen (zB @dns_get_record (...)) und dann alle Informationen verwenden, die Sie herausfinden können, wenn die Warnung passiert ist oder nicht.


versuchen Sie zu überprüfen, ob es einen booleschen Wert zurückgibt, dann können Sie es einfach als Bedingung setzen. Ich begegnete dem mit dem oci_execute (...), das mit meinen eindeutigen Schlüsseln einen Verstoß zurück gab.

ex.
oci_parse($res, "[oracle pl/sql]");
if(oci_execute){
...do something
}

Seien Sie vorsichtig mit dem @ -Operator - während er Warnungen unterdrückt, unterdrückt er auch schwerwiegende Fehler. Ich habe viel Zeit damit verbracht, ein Problem in einem System zu debuggen, in dem jemand @mysql_query( '...' ) und das Problem war, dass die MySQL-Unterstützung nicht in PHP geladen war und einen stummen, fatalen Fehler verursachte. Es ist sicher für die Dinge, die Teil des PHP-Kerns sind, aber bitte verwenden Sie es mit Sorgfalt.

[email protected]:~$ php -a
Interactive shell

php > echo @something(); // this will just silently die...

Keine weitere Ausgabe - viel Glück beim Debuggen!

[email protected]:~$ php -a
Interactive shell

php > echo something(); // lets try it again but don't suppress the error
PHP Fatal error:  Call to undefined function something() in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
[email protected]:~$ 

Diesmal können wir sehen, warum es gescheitert ist.







error-handling