Ausnahmen werden verwendet, um den normalen Ablauf eines Skripts zu ändern, wenn ein bestimmter Fehler auftritt.
PHP 5 bietet einen neuen objektorientierten Ansatz zur Fehlerbehandlung.
Die Ausnahmebehandlung wird verwendet, um den normalen Ablauf eines Skripts zu ändern, wenn eine bestimmte Fehlerbedingung (Ausnahmebedingung) auftritt. Diese Situation wird als Ausnahme bezeichnet.
Wenn eine Ausnahme ausgelöst wird, passiert normalerweise Folgendes:
Der aktuelle Codestand wird gespeichert
Die Codeausführung wird auf eine vordefinierte (benutzerdefinierte) Ausnahmehandlerfunktion umgestellt
Abhängig von der Situation kann der Prozessor die Codeausführung von einem gespeicherten Codestatus aus neu starten, die Skriptausführung beenden oder die Skriptausführung an einer anderen Stelle im Code fortsetzen.
Wir zeigen verschiedene Methoden zur Fehlerbehandlung:
Grundlegende Verwendung von Ausnahmen
Erstellen Sie einen benutzerdefinierten Ausnahmehandler
Mehrere Ausnahmen
Ausnahme erneut auslösen
Legen Sie den Ausnahmehandler der obersten Ebene fest
Hinweis: Ausnahmen sollten nur in Fehlersituationen verwendet werden und nicht dazu dienen, an einer bestimmten Stelle zu einer anderen Stelle im Code zu springen.
Wenn eine Ausnahme ausgelöst wird, wird der folgende Code nicht weiter ausgeführt und PHP versucht, einen passenden „catch“-Codeblock zu finden.
Wird die Ausnahme nicht abgefangen und nicht entsprechend mit set_Exception_handler() behandelt, kommt es zu einem schwerwiegenden Fehler (fatal error) und der Fehlermeldung „Uncaught Exception“.
Versuchen wir, eine Ausnahme auszulösen, ohne sie abzufangen:
<?php // Eine Funktion mit Ausnahmebehandlung erstellen Funktion checkNum ( $number ) { if ( $number > 1 ) { werfen neu Ausnahme ( „ Wert muss 1 oder kleiner sein “ ) ; zurückkehren WAHR ; } // Ausnahme auslösen checkNum ( 2 ) ? >
Der obige Code wird eine Fehlermeldung wie diese erhalten:
Schwerwiegender Fehler: Nicht abgefangene Ausnahme „Exception“ mit der Meldung „Wert muss 1 oder kleiner sein“ in /www/codercto/test/test.php:7 Stack-Trace: #0 /www/codercto/test/test.php(13): checkNum(2) #1 {main} wird in /www/codercto/test/test.php in Zeile 7 eingefügt
Um den im obigen Beispiel beobachteten Fehler zu vermeiden, müssen wir geeigneten Code zur Behandlung von Ausnahmen erstellen.
Der richtige Ausnahmebehandlungscode sollte Folgendes umfassen:
Try – Funktionen, die Ausnahmen verwenden, sollten sich in einem „try“-Block befinden. Wenn keine Ausnahme ausgelöst wird, wird die Ausführung des Codes wie gewohnt fortgesetzt. Wenn jedoch eine Ausnahme ausgelöst wird, wird eine Ausnahme ausgelöst.
Throw – gibt an, wie die Ausnahme ausgelöst werden soll. Jedem „Wurf“ muss mindestens ein „Fang“ entsprechen.
Catch – Der „catch“-Block fängt die Ausnahme ab und erstellt ein Objekt, das die Ausnahmeinformationen enthält.
Lassen Sie uns eine Ausnahme auslösen:
<?php // Eine Funktion mit Ausnahmebehandlung erstellen Funktion checkNum ( $number ) { if ( $number > 1 ) { werfen neu Ausnahme ( „ Variablenwert muss kleiner oder gleich 1 sein “ ) ; zurückkehren WAHR ; } // Ausnahme im Try-Block auslösen versuchen { checkNum ( 2 ) ; // Wenn eine Ausnahme ausgelöst wird, wird der folgende Text nicht ausgegeben Echo ' Wenn dieser Inhalt ausgegeben wird, erläutern Sie die $number- Variable ' ; // Ausnahme abfangen Catch ( Ausnahme $e ) { Echo ' Nachricht: ' . $e - > getMessage ( ) ; ?>
Der obige Code wird eine Fehlermeldung wie diese erhalten:
Meldung: Variablenwert muss kleiner oder gleich 1 sein
Der obige Code löst eine Ausnahme aus und fängt sie ab:
Erstellen Sie die Funktion checkNum(). Es erkennt, ob die Zahl größer als 1 ist. Wenn ja, lösen Sie eine Ausnahme aus.
Rufen Sie die Funktion checkNum() im Block „try“ auf.
Eine Ausnahme in der Funktion checkNum() wird ausgelöst.
Der „catch“-Codeblock empfängt die Ausnahme und erstellt ein Objekt ($e), das die Ausnahmeinformationen enthält.
Geben Sie die Fehlermeldung dieser Ausnahme aus, indem Sie $e->getMessage() von diesem Ausnahmeobjekt aus aufrufen.
Um jedoch dem Prinzip „Jeder Wurf muss einem Fang entsprechen“ zu folgen, können Sie einen Ausnahmehandler der obersten Ebene einrichten, der übersehene Fehler behandelt.
Das Erstellen benutzerdefinierter Ausnahmehandler ist sehr einfach. Wir haben einfach eine spezialisierte Klasse erstellt, deren Funktionen aufgerufen werden können, wenn in PHP eine Ausnahme auftritt. Diese Klasse muss eine Erweiterung der Ausnahmeklasse sein.
Diese benutzerdefinierte Klasse „customException“ erbt alle Eigenschaften der Ausnahmeklasse von PHP und Sie können ihr benutzerdefinierte Funktionen hinzufügen.
Wir beginnen mit der Erstellung der Klasse „customException“:
<?php Klasse benutzerdefinierteAusnahme erstreckt sich Ausnahme { öffentlich Funktion errorMessage ( ) { // Fehlermeldung $ errorMsg = ' Fehlerzeilennummer ' . $ this - > getLine ( ) ' : <b> ' $ this - > getMessage ( ) Eine gültige E-Mail-Adresse ' ; return $ errorMsg } } $email = " [email protected] " ; versuchen Sie es { // E-Mail erkennen if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { // Wenn es sich um eine illegale E-Mail-Adresse handelt, wird eine Ausnahme ausgelöst werfen neu customException ( $ email ) ; } fangen ( customException $e ) { // Benutzerdefinierte Nachricht anzeigen Echo $e - > errorMessage ( ) ; ?>
Diese neue Klasse ist eine Kopie der alten Ausnahmeklasse plus der Funktion errorMessage(). Nur weil es eine Kopie der alten Klasse ist, erbt sie Eigenschaften und Methoden von der alten Klasse, und wir können die Methoden der Ausnahmeklasse verwenden, wie z. B. getLine(), getFile() und getMessage().
Der obige Code löst eine Ausnahme aus und fängt sie über eine benutzerdefinierte Ausnahmeklasse ab:
Die Klasse „customException()“ wurde als Erweiterung der alten Ausnahmeklasse erstellt. Auf diese Weise erbt sie alle Eigenschaften und Methoden der alten Ausnahmeklasse.
Erstellen Sie die Funktion errorMessage(). Wenn die E-Mail-Adresse ungültig ist, gibt diese Funktion eine Fehlermeldung zurück.
Setzen Sie die Variable $email auf eine ungültige E-Mail-Adresszeichenfolge.
Der Codeblock „try“ wird ausgeführt und eine Ausnahme ausgelöst, da die E-Mail-Adresse ungültig ist.
Der Codeblock „catch“ fängt die Ausnahme ab und zeigt eine Fehlermeldung an.
Sie können mehrere Ausnahmen für ein Skript verwenden, um mehrere Situationen zu erkennen.
Sie können mehrere if..else-Codeblöcke oder einen Switch-Codeblock verwenden oder mehrere Ausnahmen verschachteln. Diese Ausnahmen können unterschiedliche Ausnahmeklassen verwenden und unterschiedliche Fehlermeldungen zurückgeben:
<?php Klasse benutzerdefinierteAusnahme erstreckt sich Ausnahme { öffentlich Funktion errorMessage ( ) { // Fehlermeldung $ errorMsg = ' Fehlerzeilennummer ' . $ this - > getLine ( ) ' : <b> ' $ this - > getMessage ( ) Eine gültige E-Mail-Adresse ' ; return $ errorMsg } } $email = " [email protected] " ; versuchen Sie es { // E-Mail erkennen if ( filter_var ( $email , FILTER_VALIDATE_EMAIL ) === FALSE ) { // Wenn es sich um eine illegale E-Mail-Adresse handelt, wird eine Ausnahme ausgelöst werfen neu customException ( $ email ) ; // Überprüfen Sie, ob „example“ in der E-Mail-Adresse enthalten ist if ( strpos ( $email , " example " ) !== FALSE ) { werfen neu Ausnahme ( „ $email ist das Beispielpostfach “ ) ; } fangen ( customException $e ) { Echo $e - > errorMessage ( ) ; Catch ( Ausnahme $e ) { Echo $e - > getMessage ( ) ; ?>
Der obige Code testet zwei Bedingungen und löst eine Ausnahme aus, wenn eine der Bedingungen nicht wahr ist:
Die Klasse „customException()“ wurde als Erweiterung der alten Ausnahmeklasse erstellt. Auf diese Weise erbt sie alle Eigenschaften und Methoden der alten Ausnahmeklasse.
Erstellen Sie die Funktion errorMessage(). Wenn die E-Mail-Adresse ungültig ist, gibt diese Funktion eine Fehlermeldung zurück.
Legen Sie die Variable $email auf eine Zeichenfolge fest, die eine gültige E-Mail-Adresse ist, aber die Zeichenfolge „example“ enthält.
Führen Sie den Codeblock „try“ aus. In der ersten Bedingung wird keine Ausnahme ausgelöst.
Da die E-Mail die Zeichenfolge „example“ enthält, löst die zweite Bedingung eine Ausnahme aus.
Der „catch“-Block fängt die Ausnahme ab und zeigt eine entsprechende Fehlermeldung an.
Wenn die Klasse „customException“ eine Ausnahme auslöst, die „customException“ jedoch nicht abgefangen wird, wird nur die Basisausnahme abgefangen, die Ausnahme wird dort behandelt.
Wenn eine Ausnahme ausgelöst wird, möchten Sie manchmal anders als standardmäßig damit umgehen. Die Ausnahme kann in einem „catch“-Block erneut ausgelöst werden.
Das Skript sollte Systemfehler vor dem Benutzer verbergen. Systemfehler mögen für Programmierer wichtig sein, aber Benutzer interessieren sich nicht dafür. Um es den Benutzern einfacher zu machen, können Sie die Ausnahme mit einer benutzerfreundlichen Meldung erneut auslösen:
<?php Klasse benutzerdefinierteAusnahme erstreckt sich Ausnahme { öffentlich Funktion errorMessage ( ) { // Fehlermeldung $errorMsg = $this -> getMessage ( ) ' Keine gültige E-Mail-Adresse . ' ; zurückkehren $ errorMsg } } $email = " [email protected] " ; versuchen Sie es { versuchen { // Überprüfen Sie, ob „example“ in der E-Mail-Adresse enthalten ist if ( strpos ( $email , " example " ) !== FALSE ) { // Wenn es sich um eine illegale E-Mail-Adresse handelt, wird eine Ausnahme ausgelöst werfen neu Ausnahme ( $ email ) ; } Catch ( Ausnahme $e ) { // Die Ausnahme erneut auslösen werfen neu customException ( $ email ) ; } fangen ( customException $e ) { // Benutzerdefinierte Informationen anzeigen Echo $e - > errorMessage ( ) ; ?>
Der obige Code erkennt, ob die Zeichenfolge „example“ in der E-Mail-Adresse enthalten ist. Wenn ja, lösen Sie die Ausnahme erneut aus:
Die Klasse „customException()“ wurde als Erweiterung der alten Ausnahmeklasse erstellt. Auf diese Weise erbt sie alle Eigenschaften und Methoden der alten Ausnahmeklasse.
Erstellen Sie die Funktion errorMessage(). Wenn die E-Mail-Adresse ungültig ist, gibt diese Funktion eine Fehlermeldung zurück.
Legen Sie die Variable $email auf eine Zeichenfolge fest, die eine gültige E-Mail-Adresse ist, aber die Zeichenfolge „example“ enthält.
Ein „try“-Block enthält einen weiteren „try“-Block, damit die Ausnahme erneut ausgelöst werden kann.
Da die E-Mail die Zeichenfolge „example“ enthält, wird die Ausnahme ausgelöst.
Der Codeblock „catch“ fängt die Ausnahme ab und löst „customException“ erneut aus.
„customException“ wird abgefangen und eine Fehlermeldung wird angezeigt.
Wenn die Ausnahme nicht im aktuellen „try“-Block abgefangen wird, sucht sie nach einem Catch-Block auf einer höheren Ebene.
Die Funktion set_Exception_handler() legt eine benutzerdefinierte Funktion fest, die alle nicht abgefangenen Ausnahmen behandelt.
<?php Funktion myException ( $Exception ) { Echo " <b>Ausnahme:</b> " , $Exception - > getMessage ( ) ; set_Exception_handler ( ' myException ' ) ; throw neu Ausnahme ( ' Nicht erfasste Ausnahme aufgetreten ' ) ;
Die Ausgabe des obigen Codes sieht folgendermaßen aus:
Ausnahme: Nicht abgefangene Ausnahme ist aufgetreten
Im obigen Code gibt es keinen „catch“-Block, stattdessen wird der Ausnahmehandler der obersten Ebene ausgelöst. Diese Funktion sollte verwendet werden, um alle nicht abgefangenen Ausnahmen abzufangen.
Code, der eine Ausnahmebehandlung erfordert, sollte in einem Try-Block platziert werden, um potenzielle Ausnahmen abzufangen.
Jeder Try- oder Throw-Block muss mindestens einen entsprechenden Catch-Block haben.
Verwenden Sie mehrere Catch-Blöcke, um verschiedene Arten von Ausnahmen abzufangen.
Ausnahmen können in einem Catch-Block innerhalb eines Try-Blocks ausgelöst (erneut ausgelöst) werden.
Kurz gesagt: Wenn eine Ausnahme ausgelöst wird, müssen Sie sie abfangen.