|
|
set_error_handler (PHP 4 >= 4.0.1, PHP 5) set_error_handler --
Bestimmt eine benutzerdefinierte Funktion zur Fehlerbehandlung.
Beschreibungstring set_error_handler ( callback error_handler)
Setzt eine benutzerdefinierte Funktion (error_handler)
um Fehler in einem Skript zu bearbeiten. Die Funktion gibt die
zuvor benutzte Fehlerbehandlungsroutine (falls eine definiert
wurde) zurück oder FALSE, falls ein Fehler auftrat. Mit dieser
Funktion können Sie Ihre eigene Behandlung von Laufzeitfehlern
definieren, beispielsweise in Anwendungen, die bei einem
kritischen Fehler die Löschung von Daten bzw. Dateien erfordert
oder wenn es nötig ist, unter bestimmten Bedingungen (mit
der Funktion trigger_error()) eine
Fehlermeldung zu generieren.
Die benutzerdefinierte Funktion erwartet notwendig zwei Parameter:
den Fehlercode und eine Beschreibung des Fehlers als String. Ab PHP
4.0.2 sind zudem drei optionale Parameter verfügbar: der Name der
Datei, in der der Fehler auftrat, die Nummer der Zeile, in der der
Fehler auftrat und der Kontext, in welchem der Fehler auftrat (ein
Array, das auf den Punkt in der aktiven Symboltabelle verweist, wo
der Fehler auftrat).
Anmerkung:
Anstelle eines Funktionsnamens kann auch ein Array, das eine
Referenz auf ein Objekt und einen Methodennamen enthält, übergeben
werden. (Seit PHP 4.3.0)
Anmerkung:
Die folgenden Fehlertypen können nicht von einer
benutzerdefinierten Funktion behandelt werden:
E_ERROR, E_PARSE,
E_CORE_ERROR, E_CORE_WARNING,
E_COMPILE_ERROR und E_COMPILE_WARNING.
Das untenstehende Beispiel zeigt die Behandlung von internen
Ausnahmen, indem eine Fehlermeldung und die Behandlung des Fehlers
durch eine benutzerdefinierte Funktion ausgelöst wird:
Beispiel 1.
Fehlerbehandlung mit set_error_handler() und
trigger_error()
<?php
// umdefinieren der Konstanten - nur in PHP 4 define("FATAL", E_USER_ERROR); define("ERROR", E_USER_WARNING); define("WARNING", E_USER_NOTICE);
// die Stufe für dieses Skript einstellen error_reporting(FATAL | ERROR | WARNING);
// Fehlerbehandlungsfunktion function myErrorHandler($errno, $errstr, $errfile, $errline) { switch ($errno) { case FATAL: echo "<b>FATAL</b> [$errno] $errstr<br />\n"; echo " Fatal error in line $errline of file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case ERROR: echo "<b>ERROR</b> [$errno] $errstr<br />\n"; break; case WARNING: echo "<b>WARNING</b> [$errno] $errstr<br />\n"; break; default: echo "Unkown error type: [$errno] $errstr<br />\n"; break; } }
// Funktion zum Test der Fehlerbehandlung function scale_by_log($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", FATAL); }
if (!is_array($vect)) { trigger_error("Incorrect input vector, array of values expected", ERROR); return null; }
for ($i=0; $i<count($vect); $i++) { if (!is_numeric($vect[$i])) trigger_error("Value at position $i is not a number, using 0 (zero)", WARNING); $temp[$i] = log($scale) * $vect[$i]; } return $temp; }
// auf die benutzerdefinierte Fehlerbehandlung umstellen $old_error_handler = set_error_handler("myErrorHandler");
// einige Fehler auslösen, zuerst wird ein gemischtes Array // definiert mit einem nichtnummerischen Eintrag echo "vector a\n"; $a = array(2, 3, "foo", 5.5, 43.3, 21.11); print_r($a);
// ein zweites Array erzeugen, das Warnungen generiert echo "----\nvector b - a warning (b = log(PI) * a)\n"; $b = scale_by_log($a, M_PI); print_r($b);
// hier ist der Grund für das Problem: anstatt einem Array // wird ein String übergeben echo "----\nvector c - an error\n"; $c = scale_by_log("not array", 2.3); var_dump($c);
// dies ist ein kritischer Fehler, der log() ist für null // oder negative Werte nicht definiert echo "----\nvector d - fatal error\n"; $d = scale_by_log($a, -2.5);
?>
|
Wenn Sie dieses Skript ausführen, erhalten Sie die folgende Ausgabe:
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a warning (b = log(PI) * a)
<b>WARNING</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - an error
<b>ERROR</b> [512] Incorrect input vector, array of values expected<br />
NULL
----
vector d - fatal error
<b>FATAL</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)<br />
Aborting...<br /> |
|
Es ist wichtig und darf nicht vergessen werden, dass die
standardmässige PHP Fehlerbehandlung vollkommen umgangen wurde. Die
Einstellungen der Funktion error_reporting()
haben keine Auswirkung und Ihre eigene Fehlerbehandlungsroutine
wird ohne Rücksicht darauf aufgerufen. Sie können jedoch immer noch
den aktuellen Wert von error_reporting
lesen und entsprechend handeln. Von besonderer Bedeutung ist, dass
dieser Wert 0 sein wird, falls der Befehl, der den Fehler verurscht
hat, mit dem
@ error-control operator versehen ist.
Beachten Sie auch, dass Sie die() aufrufen
können, wenn es notwendig ist. Wenn die Fehlerbehandlungsfunktion
zurückkehrt, wird die Ausführung des Skripts beim nächsten Befehl
nach dem fehlerverursachenden Befehl fortgesetzt.
Anmerkung:
Falls Fehler auftreten, bevor das Skript ausgeführt wird (z. B.
bei Dateiuploads), kann eine benutzerdefinierte Fehlerbehandlung
nicht aufgerufen werden, weil sie zu diesem Zeitpunkt noch nicht
registriert ist.
Siehe auch error_reporting(),
restore_error_handler(),
trigger_error(), und
error level constants.
|