Fehler- und Ausnahmebehandlung
Natürlich schreiben Programmierer nicht von Anfang an einwandfreien Code. Um alle Arbeiten an einem PHP-Programm abzuschließen, ist es wichtig, Fehler und Ausnahmen korrekt zu behandeln.
Was ist ein Fehler in PHP?
Ein PHP-Fehler ist eine Funktionsstörung in einem Programm, die durch das Schreiben einer falschen Syntax oder eines falschen Codes verursacht werden kann. Dein Browser zeigt eine Fehlermeldung an, die den Dateinamen zusammen mit dem Speicherort enthält, eine Meldung, die den Fehler beschreibt, und die Zeilennummer, in der der Fehler aufgetreten ist.
Es gibt verschiedene Arten von Fehlern in PHP. Je nach Art des Fehlers stoppt das Programm oder setzt seine Arbeit fort.
Was ist Fehlerbehandlung in PHP?
Fehlerbehandlung ist der Prozess, Fehler zu erkennen, die von deinem Programm verursacht werden, und dann entsprechende Maßnahmen zu ergreifen. Wenn du Fehler richtig behandelst, kannst du optimalen Code schreiben, der seine Funktionen im Programm immer korrekt ausführt. Mit den richtigen Kenntnissen ist es sehr einfach, Fehler in PHP zu behandeln.
Verwenden der die()-Funktion
Beim Schreiben eines PHP-Programms muss der Programmierer alle möglichen Fehler überprüfen, bevor er fortfährt, und gegebenenfalls geeignete Maßnahmen ergreifen.
Um besser zu verstehen, wie du mit der Fehlerbehandlung arbeitest, versuche das folgende Beispiel ohne die Datei /tmp/some_text_file.txt und mit dieser Datei:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php if(!file_exists("/tmp/some_text_file.txt")) { die("Datei nicht gefunden"); }else { $file = fopen("/tmp/some_text_file.txt","r"); print "Datei erfolgreich geöffnet"; } ?> |
Die die()-Funktion hilft Programmierern, effizienten Code zu schreiben. Mit der obigen Technik kannst du dein Programm stoppen, wenn es einen Fehler auslöst, und eine aussagekräftigere und benutzerfreundlichere Nachricht anzeigen.
Verwenden einer benutzerdefinierten Fehlerbehandlungsfunktion
Die PHP-Sprache wurde vorausschauend erstellt, um entwicklerfreundlich zu sein. Beispielsweise kannst du deine eigene Funktion schreiben, um einen Fehler zu behandeln. PHP stellt Programmierern ein Framework zur Verfügung, um eine Fehlerbehandlungsfunktion zu definieren.
Diese Funktion muss mindestens zwei Parameter verarbeiten können:
- Fehlerstufe
- Fehlermeldung
Aber im Allgemeinen kann sie bis zu 5 Parameter aufnehmen, von denen die Datei, die Zeilennummer und der Fehlerkontext optional sind.
Die Funktion hat folgende Syntax:
1 |
error_function(error_level, error_message, error_file, error_line, error_context); |
Um dir das Verständnis zu erleichtern, hier eine Beschreibung der einzelnen Funktionsparameter:
- error_level. Dies ist ein erforderlicher Parameter, der die Fehlermeldungsebene für den benutzerdefinierten Fehler angibt. Er hat einen Zahlenwert.
- error_message. Auch erforderlich. Der Parameter gibt die Fehlermeldung für den benutzerdefinierten Fehler an.
- error_file. Optional. Gibt den Namen der Datei an, in der der Fehler aufgetreten ist.
- error_line. Ein optionaler Parameter, der die Zeilennummer angibt, in der der Fehler aufgetreten ist.
- error_context. Optional. Gibt ein Array an, das alle Variablen und ihre Werte enthält, die verwendet wurden, als der Fehler auftrat.
error_level: Mögliche Fehlerstufen
Wenn der Code Fehler enthält, gibt die PHP-Engine Meldungen über den Parser aus, die das Vorhandensein von Fehlern im Code, ihre Beschreibung und die Codezeile, in der sie zu finden sind, angeben.
Im Allgemeinen gibt es 4 Typen von PHP-Fehlern:
- Warning error. Dieser Fehler wird vom PHP-Parser ausgegeben, wenn eines der folgenden Ereignisse in deinem Code auftritt: Es gibt eine Funktion, der die falschen Parameter übergeben wurden, oder es gibt einen Aufruf an eine Datei, die nicht gefunden werden konnte. Die Warning-Fehler hindern den Parser nicht daran, andere korrekte Codezeilen im Programm auszuführen.
- Notice error. Dieser Fehlertyp bewirkt, dass der Parser einen einfachen Hinweis anzeigt. Die Fehlermeldung weist darauf hin, dass du eine kleine Anforderung übersehen hast, beispielsweise wenn du Variablen verwenden möchtest, die du nicht definiert hast.
- Parse error. Dieser Fehler führt dazu, dass der PHP-Parser die Ausführung des Skripts stoppt, wenn er auftritt. Es kann aus folgenden Gründen auftreten: Fehlende Trennzeichen, wie z. B. ein Semikolon ; , sowie Zeichen wie Klammern/geschweifte/eckige Klammern und Anführungszeichen oder die falsche Verwendung solcher Zeichen. Ein weiterer Grund ist, dass eine Funktion, Variable oder ein anderer Name falsch geschrieben ist. Dieser Fehlertyp wird auch als Syntaxfehler bezeichnet.
- Fatal error. Diese Fehler ähneln Parse-Fehlern, da sie das Skript beenden, wenn sie auftreten. Sie sind fatal für den Code. Fatal-Fehler können dazu führen, dass dein Programmierskript fehlschlägt. Sie werden auch als Critical-Fehler bezeichnet und werden hauptsächlich durch den Aufruf einer undefinierten Funktion/undefinierten Klasse im Programmcode verursacht.
Wenn wir über benutzerdefinierte Fehlerbehandlung in PHP sprechen, dann sind hier die Fehlerebenen, die den Haupttypen zugeordnet sind. Somit stellen Fehlermeldungsebenen unterschiedliche Typen von Fehlern dar, für die ein benutzerdefinierter Fehlerbehandler verwendet werden kann. Diese Werte können auch mit dem „|“-Operator miteinander kombiniert werden:
- .E_ERROR (Wert 1). Fatal-Fehler zur Laufzeit. Die Skriptausführung wird gestoppt
- E_WARNING (Wert 2). Non-Fatal-Fehler zur Laufzeit. Die Skriptausführung wird nicht angehalten
- E_PARSE (Wert 4). Dies sind Parse-Fehler zur Kompilierzeit. Parse-Fehler sollten nur vom Parser generiert werden
- E_NOTICE (Wert 8). Fehlermeldung zur Laufzeit. Das heißt, das Skript ist auf Code gestoßen, der möglicherweise ein Fehler ist, aber dies kann auch passieren, wenn das Skript normal ausgeführt wird
- E_CORE_ERROR (Wert 16). Fatal-Fehler, die beim ersten Start von PHP auftreten
- E_CORE_WARNING (Wert 32). Non-Fatal-Fehler zur Laufzeit, die beim ersten Start von PHP auftreten
- E_USER_ERROR (Wert 256). Benutzergenerierter Fatal-Fehler, der einem E_ERROR-Fehler ähneln kann, der vom Programmierer mithilfe der PHP-Funktion trigger_error() gesetzt wird
- E_USER_WARNING (Wert 512). Benutzergenerierte Non-Fatal-Warnung, die E_WARNING ähnelt, die vom Programmierer mit der Funktion trigger_error() gesetzt wird
- E_USER_NOTICE (Wert 1024). Benutzergenerierte Benachrichtigung, die E_NOTICE ähnelt und vom Programmierer mithilfe der PHP-Funktion trigger_error() gesetzt wird
- E_STRICT (Wert 2048). Benachrichtigungen zur Laufzeit. Ermöglichen PHP, Änderungen am Code vorzuschlagen, was die beste Interoperabilität und Aufwärtskompatibilität des Codes gewährleistet
- E_RECOVERABLE_ERROR (Wert 4096). Abfangbarer Fatal-Fehler, der E_ERROR ähnelt, aber von einem benutzerdefinierten Handle (wie set_error_handler()) abgefangen werden kann
- E_ALL (Wert 8191). Alle Fehler und Warnungen außer dem Level E_STRICT, das ab PHP 6.0 Teil von E_ALL wird
Alle oben genannten Fehlerstufen können mit einer speziellen in PHP integrierten Bibliotheksfunktion eingestellt werden, wobei Stufe ($level) jeder der in der obigen Liste definierten Werte sein kann:
1 |
int error_reporting ( [int $level] ) |
Hier ist ein Beispiel für die Erstellung einer Fehlerbehandlungsfunktion:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php function handleError($errno, $errstr, $error_file, $error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Beenden des PHP-Skripts"; die(); } ?> |
Nachdem du deinen eigenen Fehlerhandler definiert hast, musst du ihn mit der in PHP integrierten Bibliotheksfunktion set_error_handler festlegen. Dieses Beispiel kann durch den Aufruf einer nicht existierenden Funktion verdeutlicht werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php error_reporting( E_ERROR ); function handleError($errno, $errstr, $error_file, $error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Beenden des PHP-Skripts"; die(); } set_error_handler("handleError"); //Einrichtung der Fehlerbehandlung myFunction(); //Fehleraufruf ?> |
Dies sind die Grundlagen der benutzerdefinierten Fehlerbehandlung in PHP. Mit ein wenig Übung wird es einfacher.
Um die PHP-Entwicklung zu optimieren, greifen Programmierer oft auf die Verwendung eines zuverlässigen Proxys zurück. Für die Installation und korrekte Verwendung sind normalerweise zusätzliche Kenntnisse erforderlich. Es gibt jedoch spezielle Tools, die Programmierern die Arbeit erleichtern. So installieren sie den Proxy Manager und erhalten alle Vorteile in einer praktischen Oberfläche.
Ausnahmebehandlung
Es ist wichtig, Ausnahmen korrekt behandeln zu können, da sie eine bessere Kontrolle über die Fehlerbehandlung bieten. PHP hat ein Ausnahmemodell ähnlich wie andere Programmiersprachen.
Nachfolgend sind die mit Ausnahmen verknüpften Schlüsselwörter aufgeführt:
- try - eine Funktion, die eine Ausnahme verwendet. Sie sollte im try-Block stehen. Wenn die Ausnahme nicht ausgelöst wird, wird der Code weiterhin normal ausgeführt. Wenn jedoch eine Ausnahme ausgelöst wird, wird sie „ausgeworfen“ (thrown).
- throw - so löst du eine Ausnahme aus. Jede „throw“ muss mindestens einen „catch“ enthalten.
- catch – der catch-Block ruft die Ausnahme ab und erstellt ein Objekt, das Informationen über die Ausnahme enthält.
Wenn eine Ausnahme auftritt, wird der Code nach der Anweisung nicht ausgeführt und PHP versucht, den ersten passenden catch-Block zu finden. Wenn die Ausnahme nicht abgefangen wird, wird ein Fatal-Fehler mit der Meldung „Uncaught Exception“ ausgegeben.
Eine Ausnahme kann in PHP ausgeworfen und abgefangen („catched“) werden. Der Code kann in einen try-Block eingeschlossen werden.
Jeder try muss mindestens einen entsprechenden catch-Block haben. Du kannst auch mehrere catch-Blöcke verwenden, um verschiedene Klassen von Ausnahmen abzufangen. Ausnahmen können im catch-Block ausgeworfen (oder erneut ausgeworfen) werden.
Hier ist ein Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php try { $error = 'Diesen Fehler immer ausgeben'; throw new Exception($error); echo 'Nie ausgeführt'; // Code nach einer Ausnahme wird nicht ausgeführt }catch (Exception $e) { echo 'Abgefangene Ausnahme: ', $e->getMessage(), "\n"; } echo 'Hello World!'; // Ausführung fortsetzen ?> |
Im obigen Beispiel wird die Funktion $e->getMessage verwendet, um die Fehlermeldung zu erhalten. PHP hat auch andere Funktionen, die von der Exception-Klasse verwendet werden können:
- getMessage() - Ausnahmemeldung
- getCode() - Ausnahmecode
- getLine() - Quellzeile
- getFile() - ursprünglicher Dateiname
- getTrace() - Array n von backtrace()
- getTraceAsString() − formatierte Trace-String
Du kannst deinen eigenen Exception-Handler definieren. Verwende die folgende Funktion, um eine benutzerdefinierte Ausnahmebehandlungsfunktion festzulegen:
1 |
string set_exception_handler (callback $exception_handler) |
Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php function exception_handler($exception) { echo "Uncaught Exception: " , $exception->getMessage(), "\n"; } set_exception_handler('exception_handler'); throw new Exception('Uncaught Exception'); echo "Nicht ausgeführt\n"; ?> |
Dabei ist exception_handler der Name der Funktion, die aufgerufen wird, wenn eine nicht abgefangene Ausnahme (Uncaught Exception) auftritt. Diese Funktion muss vor dem Aufruf von set_exception_handler() definiert werden.
Autor: Nils Reimers