In PHP ist die Standardfehlerbehandlung einfach. An den Browser wird eine Fehlermeldung mit dem Dateinamen, der Zeilennummer und einer den Fehler beschreibenden Meldung gesendet.
Die Fehlerbehandlung ist ein wichtiger Bestandteil bei der Erstellung von Skripten und Webanwendungen. Fehlt Ihrem Code eine Fehlererkennungscodierung, sieht das Programm unprofessionell aus und birgt Sicherheitsrisiken.
Dieses Tutorial stellt einige der wichtigsten Fehlererkennungsmethoden in PHP vor.
Wir erklären Ihnen verschiedene Methoden zur Fehlerbehandlung:
Einfache „die()“-Anweisung
Benutzerdefinierte Fehler und Fehlerauslöser
Fehlerbericht
Das erste Beispiel zeigt ein einfaches Skript, das eine Textdatei öffnet:
<?php$file=fopen("welcome.txt","r");?>
Wenn die Datei nicht existiert, erhalten Sie eine Fehlermeldung wie diese:
Warnung: fopen(welcome.txt) [function.fopen]: Stream konnte nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis in /www/codercto/test/test.php in Zeile 2
Um zu vermeiden, dass Benutzer Fehlermeldungen wie die obige erhalten, prüfen wir, ob die Datei existiert, bevor wir darauf zugreifen:
<?phpif(!file_exists("welcome.txt")){ die("Datei existiert nicht");}else{ $file=fopen("welcome.txt","r");}?>
Wenn die Datei nun nicht existiert, erhalten Sie eine Fehlermeldung wie diese:
Datei existiert nicht
Der obige Code ist effizienter als der vorherige Code, da er einen einfachen Fehlerbehandlungsmechanismus verwendet, um das Skript nach einem Fehler zu beenden.
Allerdings ist es nicht immer sinnvoll, das Skript einfach zu beenden. Sehen wir uns alternative PHP-Funktionen zur Fehlerbehandlung an.
Das Erstellen eines benutzerdefinierten Fehlerhandlers ist sehr einfach. Wir haben einfach eine dedizierte Funktion erstellt, die aufgerufen werden kann, wenn in PHP ein Fehler auftritt.
Die Funktion muss mindestens zwei Parameter verarbeiten können (Fehlerstufe und Fehlermeldung), kann aber bis zu fünf Parameter akzeptieren (optional: Datei, Zeilennummer und Fehlerkontext):
error_function(error_level,error_message,error_file,error_line,error_context)
Parameter | beschreiben |
---|---|
Fehlerebene | Erforderlich. Gibt die Fehlerberichtsebene für benutzerdefinierte Fehler an. Muss eine Zahl sein. Siehe die Tabelle unten: Fehlerberichtsebenen. |
error_message | Erforderlich. Gibt Fehlermeldungen für benutzerdefinierte Fehler an. |
Fehlerdatei | Optional. Gibt den Dateinamen an, in dem der Fehler aufgetreten ist. |
Fehlerzeile | Optional. Gibt die Zeilennummer an, in der der Fehler aufgetreten ist. |
error_context | Optional. Gibt ein Array an, das alle zum Zeitpunkt des Fehlers verwendeten Variablen und deren Werte enthält. |
Bei diesen Fehlerberichtsebenen handelt es sich um verschiedene Arten von Fehlern, die von benutzerdefinierten Fehlerhandlern behandelt werden:
Wert | Konstante | beschreiben |
---|---|---|
2 | E_WARNUNG | Nicht schwerwiegender Laufzeitfehler. Unterbrechen Sie die Skriptausführung nicht. |
8 | E_NOTICE | Laufzeitbenachrichtigungen. Tritt auf, wenn das Skript einen möglichen Fehler findet, kann aber auch auftreten, wenn das Skript normal ausgeführt wird. |
256 | E_USER_ERROR | Schwerwiegender benutzergenerierter Fehler. Dies ähnelt E_ERROR, das der Programmierer mit der PHP-Funktion trigger_error() setzt. |
512 | E_USER_WARNING | Nicht schwerwiegende, vom Benutzer generierte Warnung. Dies ähnelt der E_WARNING, die der Programmierer mit der PHP-Funktion trigger_error() setzt. |
1024 | E_USER_NOTICE | Vom Benutzer generierte Benachrichtigungen. Dies ähnelt E_NOTICE, das vom Programmierer mithilfe der PHP-Funktion trigger_error() festgelegt wird. |
4096 | E_RECOVERABLE_ERROR | Abfangbare schwerwiegende Fehler. Wie E_ERROR, kann aber von benutzerdefinierten Handlern abgefangen werden. (Siehe set_error_handler()) |
8191 | E_ALL | Alle Fehler und Warnungen. (In PHP 5.4 wird E_STRICT Teil von E_ALL) |
Erstellen wir nun eine Funktion, die Fehler behandelt:
function customError($errno, $errstr){ echo "<b>Fehler:</b> [$errno] $errstr<br>"; echo "Ende des Skripts";
Der obige Code ist eine einfache Fehlerbehandlungsfunktion. Wenn es ausgelöst wird, erhält es die Fehlerstufe und die Fehlermeldung. Anschließend werden die Fehlerstufe und die Meldung ausgegeben und das Skript beendet.
Nachdem wir nun eine Fehlerbehandlungsfunktion erstellt haben, müssen wir bestimmen, wann sie ausgelöst werden soll.
Der Standard-Fehlerbehandler von PHP ist der integrierte Fehlerbehandler. Wir werden die obige Funktion in den Standard-Fehlerbehandler umwandeln, wenn das Skript ausgeführt wird.
Fehlerhandler können so geändert werden, dass sie nur auf bestimmte Fehler angewendet werden, sodass das Skript verschiedene Fehler unterschiedlich behandeln kann. In diesem Fall verwenden wir jedoch unseren benutzerdefinierten Fehlerhandler für alle Fehler:
set_error_handler("customError");
Da wir möchten, dass unsere benutzerdefinierte Funktion alle Fehler behandelt, erfordert set_error_handler() nur ein Argument, und ein zweites Argument kann hinzugefügt werden, um die Fehlerstufe anzugeben.
Testen Sie diesen Fehlerhandler, indem Sie versuchen, eine Variable zu drucken, die nicht existiert:
<?php// Fehlerbehandlungsfunktion function customError($errno, $errstr){ echo "<b>Fehler:</b> [$errno] $errstr";}// Fehlerbehandlungsfunktion festlegen set_error_handler("customError") ;//Fehler auslösen echo($test);?>
Die Ausgabe des obigen Codes sieht folgendermaßen aus:
Fehler: [8] Undefinierte Variable: Test
Wenn der Benutzer Daten in ein Skript eingibt, ist es sinnvoll, einen Fehler auszulösen, wenn die Eingabe des Benutzers ungültig ist. In PHP wird diese Aufgabe durch die Funktion trigger_error() erledigt.
Wenn in diesem Beispiel die Variable „test“ größer als „1“ ist, tritt ein Fehler auf:
<?php$test=2;if ($test>1){ trigger_error("Variablenwert muss kleiner oder gleich 1 sein");}?>
Die Ausgabe des obigen Codes sieht folgendermaßen aus:
Hinweis: Der Variablenwert muss kleiner oder gleich 1in /www/test/codercto.php in Zeile 5 sein
Sie können an einer beliebigen Stelle im Skript einen Fehler auslösen und durch Hinzufügen eines zweiten Parameters die Fehlerstufe angeben, die ausgelöst wird.
Mögliche Fehlertypen:
E_USER_ERROR – Schwerwiegender, vom Benutzer generierter Laufzeitfehler. Der Fehler kann nicht behoben werden. Die Skriptausführung wurde unterbrochen.
E_USER_WARNING – Nicht schwerwiegende, vom Benutzer generierte Laufzeitwarnung. Die Skriptausführung wird nicht unterbrochen.
E_USER_NOTICE – Standard. Vom Benutzer generierte Laufzeitbenachrichtigungen. Tritt auf, wenn das Skript einen möglichen Fehler findet, kann aber auch auftreten, wenn das Skript normal ausgeführt wird.
Wenn in diesem Beispiel die Variable „test“ größer als „1“ ist, tritt ein E_USER_WARNING-Fehler auf. Wenn E_USER_WARNING auftritt, verwenden wir unseren benutzerdefinierten Fehlerhandler und beenden das Skript:
<?php// Fehlerbehandlungsfunktion customError($errno, $errstr){ echo "<b>Fehler:</b> [$errno] $errstr<br>"; }//Legen Sie die Fehlerbehandlungsfunktion fest set_error_handler("customError",E_USER_WARNING);//Fehler auslösen $test=2;if ($test>1){ trigger_error("Variablenwert muss kleiner oder gleich 1 sein",E_USER_WARNING);}?>
Die Ausgabe des obigen Codes sieht folgendermaßen aus:
Fehler: [512] Variablenwert muss kleiner oder gleich 1 sein. Ende des Skripts
Nachdem wir nun gelernt haben, wie wir eigene Fehler erstellen und auslösen können, werfen wir einen Blick auf die Fehlerprotokollierung.
Standardmäßig sendet PHP Fehlerprotokolle an das Protokollsystem oder die Datei des Servers, abhängig von der error_log-Konfiguration in php.ini. Mit der Funktion error_log() können Sie Fehlerdatensätze an eine angegebene Datei oder ein Remote-Ziel senden.
Sich selbst eine Fehlermeldung per E-Mail zuzusenden ist eine gute Möglichkeit, über einen bestimmten Fehler informiert zu werden.
Wenn im folgenden Beispiel ein bestimmter Fehler auftritt, senden wir eine E-Mail mit einer Fehlermeldung und beenden das Skript:
<?php// Fehlerbehandlungsfunktion customError($errno, $errstr){ echo „<b>Fehler:</b> [$errno] $errstr<br>“; echo „Der Website-Administrator wurde benachrichtigt“; („Fehler: [$errno] $errstr“,1, „[email protected]“, „From: [email protected]“);}// Setzen Sie die Fehlerbehandlungsfunktion set_error_handler("customError",E_USER_WARNING); // Fehler auslösen $test=2;if ($test>1){ trigger_error("Variablenwert muss kleiner oder gleich 1 sein",E_USER_WARNING);} ?>
Die Ausgabe des obigen Codes sieht folgendermaßen aus:
Fehler: [512] Der Variablenwert muss kleiner oder gleich 1 sein. Der Website-Administrator wurde benachrichtigt
Die vom obigen Code erhaltene E-Mail sieht folgendermaßen aus:
Fehler: [512] Variablenwert muss kleiner oder gleich 1 sein
Diese Methode ist nicht für alle Fehler geeignet. Allgemeine Fehler sollten auf dem Server mit dem standardmäßigen PHP-Protokollierungssystem protokolliert werden.