set_error_handler
Bestimmt eine benutzerdefinierte Funktion zur Fehlerbehandlung.
Beschreibungstringset_error_handlercallbackerror_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).
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)
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:
Fehlerbehandlung mit set_error_handler und
trigger_error
FATAL [$errno] $errstr \n";
echo " Fatal error in line $errline of file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ") \n";
echo "Aborting... \n";
exit(1);
break;
case ERROR:
echo "ERROR [$errno] $errstr \n";
break;
case WARNING:
echo "WARNING [$errno] $errstr \n";
break;
default:
echo "Unkown error type: [$errno] $errstr \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
]]>
Wenn Sie dieses Skript ausführen, erhalten Sie die folgende Ausgabe:
2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a warning (b = log(PI) * a)
WARNING [1024] Value at position 2 is not a number, using 0 (zero)
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - an error
ERROR [512] Incorrect input vector, array of values expected
NULL
----
vector d - fatal error
FATAL [256] log(x) for x <= 0 is undefined, you used: scale = -2.5
Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)
Aborting...
]]>
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.
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.