Signatur
Beschreibung
set_error_handler() ersetzt den eingebauten PHP-Fehlerhandler durch eine eigene Funktion. Damit lässt sich die Fehlerbehandlung vollständig steuern: Fehler können geloggt, in Exceptions umgewandelt, dem Benutzer benutzerfreundlich angezeigt oder still ignoriert werden. In modernen Anwendungen wird diese Funktion typischerweise genutzt, um alle Fehler in ein zentrales Logging-System (z. B. Monolog) zu leiten oder um alle Fehler als ErrorException weiterzuwerfen.
Die Callback-Funktion erhält folgende Parameter: int $errno (Fehlertyp), string $errstr (Fehlermeldung), string $errfile (Datei), int $errline (Zeile). Gibt der Callback true zurück, gilt der Fehler als behandelt und PHP führt keine weitere interne Verarbeitung durch. Gibt er false zurück (oder null), wird der PHP-Standardhandler zusätzlich ausgeführt.
Über den Parameter $error_levels lässt sich steuern, für welche Fehlertypen der Handler greift — analog zu error_reporting(). Bestimmte Fehler wie E_ERROR, E_PARSE, E_CORE_ERROR und E_COMPILE_ERROR können nicht mit einem benutzerdefinierten Handler abgefangen werden; für diese ist register_shutdown_function() in Kombination mit error_get_last() notwendig.
Wird null als Callback übergeben, wird der vorherige Handler wiederhergestellt. set_error_handler() gibt den zuvor registrierten Handler zurück, sodass er nach Bedarf wieder aktiviert werden kann.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callback Pflicht | ?callable | Die benutzerdefinierte Fehlerbehandlungs-Funktion oder null, um den vorherigen Handler wiederherzustellen. Die Signatur des Callbacks lautet: function(int $errno, string $errstr, string $errfile, int $errline): bool. |
|
| $error_levels | int | E_ALL | Bitmaske der Fehlertypen, für die der Handler aufgerufen wird. Entspricht in der Syntax den Konstanten wie E_WARNING, E_NOTICE usw., die auch bei error_reporting() verwendet werden. |
Rückgabewert
callable zurück, oder null, wenn kein benutzerdefinierter Handler aktiv war (also der PHP-Standard-Handler genutzt wurde).Beispiele
Alle Fehler als ErrorException werfen
<?php
set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool {
// @ (Fehlerunterdrückung) respektieren
if (!(error_reporting() & $errno)) {
return false;
}
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try {
// Löst einen E_WARNING aus, der nun zur Exception wird
$result = file_get_contents('/pfad/existiert/nicht.txt');
} catch (ErrorException $e) {
echo 'Fehler abgefangen: ' . $e->getMessage() . PHP_EOL;
}
Fehler in Datei loggen und nur bestimmte Level behandeln
<?php
$previousHandler = set_error_handler(
function (int $errno, string $errstr, string $errfile, int $errline): bool {
$message = sprintf(
'[%s] Fehler %d: %s in %s:%d' . PHP_EOL,
date('Y-m-d H:i:s'),
$errno,
$errstr,
$errfile,
$errline
);
file_put_contents('/var/log/php_errors.log', $message, FILE_APPEND);
// Standard-PHP-Handler NICHT zusätzlich ausführen
return true;
},
E_WARNING | E_NOTICE // nur Warnungen und Hinweise abfangen
);
trigger_error('Testwarnung', E_USER_NOTICE);
// Vorherigen Handler wiederherstellen
set_error_handler($previousHandler);
// Wichtig · Fallstricke
Nicht abfangbare Fehler: Fatale Fehler wie E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR und E_COMPILE_WARNING können mit set_error_handler() nicht behandelt werden. Für fatale Fehler ist register_shutdown_function() zusammen mit error_get_last() zu verwenden.
Fehlerunterdrückung mit @: Wird ein Aufruf mit dem @-Operator unterdrückt, liefert error_reporting() innerhalb des Handlers den Wert 0 zurück. Der Handler sollte dies prüfen und false zurückgeben, um das Verhalten korrekt zu respektieren.
Sicherheit: Im Produktionsbetrieb sollten Fehlermeldungen niemals direkt an den Benutzer ausgegeben werden, da sie interne Pfade, Datenbankstrukturen oder andere sensible Informationen preisgeben können. Der Handler sollte Fehler nur intern loggen und dem Benutzer eine generische Fehlermeldung anzeigen.