Start · Sprachen · PHP · Referenz · set_error_handler

set_error_handler

Funktion

Registriert eine benutzerdefinierte Callback-Funktion zur Behandlung von PHP-Laufzeitfehlern.

seit PHP 4.0.1 Kategorie: error

Signatur

set_error_handler(?callable $callback, int $error_levels = E_ALL): ?callable

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

Typ
?callable
Beschreibung
Gibt den zuvor registrierten Fehlerhandler als 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 abgefangen: file_get_contents(/pfad/existiert/nicht.txt): Failed to open stream: No such file or directory

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.