error_get_last()
Die PHP-Funktion error_get_last() liefert Typ, Meldung, Datei und Zeile des zuletzt aufgetretenen Fehlers oder null, wenn kein Fehler vorliegt.
Die Fehlerbehandlung ist ein wichtiger Bestandteil der PHP-Programmierung, da Fehler an jedem Punkt während der Ausführung auftreten können. Die Funktion error_get_last() ist eine integrierte PHP-Funktion, mit der Sie den zuletzt aufgezeichneten Fehler untersuchen können — seinen Typ, seine Meldung, die Datei und die Zeile — um ihn zu protokollieren oder im Code darauf zu reagieren. Dieses Kapitel erklärt, was die Funktion zurückgibt, wann sie null zurückgibt, welche Fehlerarten sie erfasst und welche nicht, und wie sie in modernem PHP korrekt eingesetzt wird.
Was error_get_last() zurückgibt
error_get_last() akzeptiert keine Argumente und gibt Informationen über den letzten von PHP ausgelösten Fehler während der aktuellen Anfrage zurück. Der Rückgabewert ist eine von zwei Möglichkeiten:
- Ein assoziatives array mit vier Schlüsseln, wenn ein Fehler aufgetreten ist.
null, wenn noch kein Fehler aufgezeichnet wurde.
Das array hat folgende Struktur:
[
'type' => 2, // int: the error level (E_WARNING here)
'message' => 'fopen(...): ...', // string: the error description
'file' => '/path/to/script.php', // string: file where the error happened
'line' => 12, // int: line number where it happened
]Das Element type ist eine Ganzzahl, die einer der PHP-Fehlerkonstanten entspricht — zum Beispiel E_WARNING (2), E_NOTICE (8), E_USER_WARNING (512) oder E_DEPRECATED. Eine vollständige Liste finden Sie in der PHP-Fehlerreferenz.
Was erfasst wird und was nicht
Dies ist der Teil, den viele falsch verstehen, daher lohnt es sich, ihn genau zu betrachten:
- Die Funktion erfasst gemeldete Fehler, Warnungen, Hinweise und Veraltungshinweise — alles, was durch PHPs normalen Fehlermechanismus läuft, einschließlich derjenigen, die mit
trigger_error()ausgelöst wurden. - Sie erfasst keine Ausnahmen. In modernem PHP (7.0+) werfen viele Fehler Ausnahmen statt Fehler zu melden — zum Beispiel wirft Division und Modulo durch null einen
DivisionByZeroError, keine Warnung. Diese müssen mittry/catchbehandelt werden, underror_get_last()sieht sie nicht. - Sie sieht nur Fehler, die tatsächlich gemeldet werden. Wenn ein Fehlerlevel durch
error_reporting()herausgefiltert wird, erscheint er nicht. Aktivieren Sie beim Debuggenerror_reporting(E_ALL), damit nichts stillschweigend verworfen wird.
Daher ist error_get_last() am nützlichsten unmittelbar nach dem Aufruf einer eingebauten Funktion, die einen Fehler über eine Warnung signalisiert (wie fopen(), file_get_contents() oder unlink()), und innerhalb einer benutzerdefinierten Shutdown-Funktion, um einen fatalen Fehler abzufangen, der die Anfrage beendet hat.
Beispiele
Die letzte Warnung eines fehlgeschlagenen fopen() auslesen
Funktionen wie fopen() geben false zurück und lösen ein E_WARNING aus, wenn sie fehlschlagen. Der Operator @ unterdrückt die Ausgabe der Warnung, erlaubt aber trotzdem, sie mit error_get_last() auszulesen:
<?php
error_reporting(E_ALL);
$handle = @fopen("/no/such/file.txt", "r");
if ($handle === false) {
$error = error_get_last();
echo "Type: " . $error['type'] . "\n";
echo "Message: " . $error['message'] . "\n";
echo "Line: " . $error['line'] . "\n";
}
?>Ausgabe:
Type: 2
Message: fopen(/no/such/file.txt): Failed to open stream: No such file or directory
Line: 4type ist 2, was dem Wert der Konstante E_WARNING entspricht, und die Meldung stammt direkt von fopen().
Einen selbst ausgelösten Fehler erfassen
Sie können mit trigger_error() einen eigenen Fehler aufzeichnen und ihn anschließend auslesen:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
trigger_error("Invalid configuration value", E_USER_WARNING);
$error = error_get_last();
echo "Message: " . $error['message'] . "\n";
echo "Type: " . $error['type'] . "\n"; // 512 = E_USER_WARNING
?>Ausgabe:
Message: Invalid configuration value
Type: 512Wenn kein Fehler aufgetreten ist
Wenn bisher nichts schiefgelaufen ist, gibt die Funktion null zurück — prüfen Sie daher immer, bevor Sie auf array-Schlüssel zugreifen:
<?php
$error = error_get_last();
var_dump($error); // NULL — guard against this before using $error['message']
?>Ausgabe:
NULLHäufige Fallstricke
- Prüfen Sie das Ergebnis immer auf null (
if ($error !== null)), bevor Sie auf$error['message']zugreifen, sonst lösen Sie eine neue Warnung „trying to access array offset on null" aus. - Division durch null ist keine Warnung mehr. Verwenden Sie
try/catchfürDivisionByZeroError;error_get_last()meldet ihn nicht. - Für die programmatische Protokollierung anstatt der reinen Inspektion sollten Sie in Betracht ziehen, diese Funktion mit
error_log()oder einem benutzerdefinierten Handler zu kombinieren, der überset_error_handler()registriert wird.
Fazit
error_get_last() liefert Typ, Meldung, Datei und Zeile des zuletzt von PHP aufgezeichneten Fehlers — oder null, wenn keiner vorhanden war. Verwenden Sie die Funktion direkt nach dem Aufruf einer eingebauten Funktion, die mit einer Warnung fehlschlägt, oder innerhalb einer Shutdown-Funktion — und denken Sie daran, dass Ausnahmen (einschließlich moderner Division durch null) stattdessen try/catch erfordern.