PHP Ausnahmebehandlung


Ausnahmen werden verwendet, um den normalen Ablauf eines Skripts zu ändern, wenn ein bestimmter Fehler auftritt.


Was ist eine Ausnahme

PHP 5 bietet eine neue objektorientierte Methode zur Fehlerbehandlung.

Die Ausnahmebehandlung wird verwendet, um den normalen Ablauf eines Skripts zu ändern, wenn eine bestimmte Fehlerbedingung (Ausnahme) auftritt. Diese Bedingung wird als Ausnahme bezeichnet.

Wenn eine Ausnahme ausgelöst wird, geschieht normalerweise Folgendes:

  • Der aktuelle Codezustand wird gespeichert
  • Die Codeausführung wird auf eine vordefinierte (benutzerdefinierte) Exception-Handler-Funktion umgeschaltet
  • Je nach Situation kann der Handler die Codeausführung vom gespeicherten Codezustand aus fortsetzen, die Skriptausführung beenden oder das Skript an einer anderen Stelle im Code fortsetzen

Wir zeigen verschiedene Methoden zur Fehlerbehandlung:

  • Grundlegende Verwendung von Exceptions
  • Erstellen eines benutzerdefinierten Exception-Handlers
  • Mehrere Exceptions
  • Erneutes Auslösen von Exceptions
  • Festlegen des Top-Level-Exception-Handlers

Hinweis:Exceptions sollten nur in Fehlersituationen verwendet werden und nicht dazu dienen, an einer bestimmten Stelle im Code zu einer anderen Position zu springen.


Grundlegende Verwendung von Exceptions

Wenn eine Exception ausgelöst wird, wird der Code danach nicht weiter ausgeführt, und PHP versucht, einen passenden "catch"-Block zu finden.

Wenn die Exception nicht abgefangen wird und set_exception_handler() nicht zur entsprechenden Behandlung verwendet wird, tritt ein schwerwiegender Fehler (fataler Fehler) auf, und es wird eine Fehlermeldung "Uncaught Exception" ausgegeben.

Versuchen wir, eine Ausnahme auszulösen, ohne sie abzufangen:

<?php //Erstellen Sie eine Funktion mit Ausnahmebehandlung function checkNum($number) { if($number>1) { throw new Exception("Wert muss 1 oder kleiner sein"); } return true; } //Eine Ausnahme auslösen checkNum(2); ?>

Der obige Code führt zu einem Fehler ähnlich diesem:

Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/example/test/test.php:7 Stack trace: #0 /www/example/test/test.php(13): checkNum(2) #1 {main} thrown in /www/example/test/test.php on line 7

Try, throw und catch

Um den Fehler zu vermeiden, der im obigen Beispiel aufgetreten ist, müssen wir geeigneten Code erstellen, um Ausnahmen zu behandeln.

Geeigneter Code zur Ausnahmebehandlung sollte Folgendes enthalten:

  1. Try - Die Funktion, die die Ausnahme verwendet, sollte sich in einem "try"-Block befinden. Wenn keine Ausnahme ausgelöst wird, wird die Ausführung des Codes wie gewohnt fortgesetzt. Aber wenn eine Ausnahme ausgelöst wird, wird eine Ausnahme geworfen.
  2. Throw - gibt an, wie eine Ausnahme ausgelöst wird. Jedes "throw" muss mindestens einem "catch" entsprechen.
  3. Catch - Der "catch"-Block fängt die Ausnahme ab und erstellt ein Objekt, das Ausnahmeinformationen enthält.

Lassen Sie uns eine Ausnahme auslösen:

<?php //Erstellen Sie eine Funktion mit Ausnahmebehandlung function checkNum($number) { if($number>1) { throw new Exception("Der Variablenwert muss kleiner oder gleich 1 sein"); } return true; } //Lösen Sie eine Ausnahme im try-Block aus try { checkNum(2); //Wenn eine Ausnahme ausgelöst wird, wird der folgende Text nicht ausgegeben echo 'Wenn dieser Inhalt ausgegeben wird, bedeutet das, dass die Variable $number'; } //Die Ausnahme abfangen catch(Exception $e) { echo 'Nachricht: ' .$e->getMessage(); } ?>

Der obige Code führt zu einem Fehler ähnlich diesem:

Message: 变量值必须小于等于 1

Beispielerklärung:

Der obige Code hat eine Ausnahme ausgelöst und sie abgefangen:

  1. Erstellen Sie eine checkNum()-Funktion. Sie prüft, ob die Zahl größer als 1 ist. Wenn ja, löst sie eine Ausnahme aus.
  2. Rufen Sie die checkNum()-Funktion im "try"-Block auf.
  3. Die Ausnahme in der checkNum()-Funktion wird ausgelöst.
  4. Der "catch"-Block empfängt die Ausnahme und erstellt ein Objekt, das Ausnahmeinformationen enthält ($e).
  5. Durch den Aufruf von $e->getMessage() auf diesem Ausnahmeobjekt geben Sie die Fehlermeldung dieser Ausnahme aus.

Um jedoch dem Prinzip zu folgen, dass "jedem throw ein catch entsprechen muss", können Sie einen Ausnahmehandler auf oberster Ebene festlegen, um übersehene Fehler zu behandeln.


Eine benutzerdefinierte Ausnahmeklasse erstellen

Das Erstellen eines benutzerdefinierten Ausnahmehandlers ist sehr einfach. Wir erstellen einfach eine spezielle Klasse, deren Funktionen aufgerufen werden können, wenn in PHP eine Ausnahme auftritt. Diese Klasse muss eine Erweiterung der Exception-Klasse sein.

Diese benutzerdefinierte customException-Klasse erbt alle Eigenschaften der Exception-Klasse von PHP, und Sie können benutzerdefinierte Funktionen zu ihr hinzufügen.

Beginnen wir mit der Erstellung der customException-Klasse:

<?php class customException extends Exception { public function errorMessage() { //Fehlermeldung $errorMsg = 'Fehlerzeilennummer'.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> ist keine gültige E-Mail-Adresse'; return $errorMsg; } } $email = "[email protected]"; try { //E-Mail prüfen if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //Wenn es sich um eine ungültige E-Mail-Adresse handelt, löse eine Ausnahme aus throw new customException($email); } } catch (customException $e) { //eine benutzerdefinierte Nachricht anzeigen echo $e->errorMessage(); } ?>

Diese neue Klasse ist eine Kopie der alten Exception-Klasse, plus der Funktion errorMessage(). Da sie eine Kopie der alten Klasse ist, erbt sie Eigenschaften und Methoden von der alten Klasse, und wir können Methoden der Exception-Klasse verwenden, wie getLine(), getFile() und getMessage().

Beispielerklärung:

Der obige Code hat eine Exception ausgelöst und sie mit einer benutzerdefinierten Exception-Klasse abgefangen:

  1. Die Klasse customException() wird als Erweiterung der alten Exception-Klasse erstellt. Auf diese Weise erbt sie alle Eigenschaften und Methoden der alten Exception-Klasse.
  2. Erstellen Sie die Funktion errorMessage(). Wenn die E-Mail-Adresse ungültig ist, gibt diese Funktion eine Fehlermeldung zurück.
  3. Weisen Sie der Variable $email eine ungültige E-Mail-Adresse als Zeichenfolge zu.
  4. Führe den "try"-Block aus, und weil die E-Mail-Adresse ungültig ist, wird eine Exception ausgelöst.
  5. Der "catch"-Block fängt die Exception ab und zeigt die Fehlermeldung an.

Mehrere Exceptions

Mehrere Exceptions können verwendet werden, damit ein Skript mehrere Situationen erkennt.

Du kannst mehrere if..else-Blöcke, einen switch-Block oder verschachtelte Exceptions verwenden. Diese Exceptions können unterschiedliche Exception-Klassen verwenden und unterschiedliche Fehlermeldungen zurückgeben:

<?php class customException extends Exception { public function errorMessage() { //Fehlermeldung $errorMsg = 'Fehlerzeilennummer'.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> ist keine gültige E-Mail-Adresse'; return $errorMsg; } } $email = "[email protected]"; try { //E-Mail prüfen if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //Wenn es sich um eine ungültige E-Mail-Adresse handelt, löse eine Ausnahme aus throw new customException($email); } //Prüfe, ob "example" in der E-Mail-Adresse enthalten ist if(strpos($email, "example") !== FALSE) { throw new Exception("$emailIst eine Beispiel-E-Mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>

Beispielerklärung:

Der obige Code prüft zwei Bedingungen, und wenn eine der Bedingungen nicht erfüllt ist, wird eine Exception ausgelöst:

  1. Die Klasse customException() wird als Erweiterung der alten Exception-Klasse erstellt. Auf diese Weise erbt sie alle Eigenschaften und Methoden der alten Exception-Klasse.
  2. Erstellen Sie die Funktion errorMessage(). Wenn die E-Mail-Adresse ungültig ist, gibt diese Funktion eine Fehlermeldung zurück.
  3. Setze die Variable $email auf eine Zeichenkette, die eine gültige E-Mail-Adresse ist, aber die Zeichenkette "example" enthält.
  4. Führe den "try"-Block aus; unter der ersten Bedingung wird keine Exception geworfen.
  5. Weil die E-Mail die Zeichenkette "example" enthält, löst die zweite Bedingung eine Exception aus.
  6. Der "catch"-Block fängt die Exception ab und zeigt eine passende Fehlermeldung an.

Wenn die Klasse customException eine Exception wirft, customException aber nicht abgefangen wird und nur die Basis-Exception abgefangen wird, dann wird die Exception dort behandelt.


Erneutes Auslösen von Exceptions

Manchmal, wenn eine Exception geworfen wird, möchtest du sie vielleicht anders als auf die übliche Weise behandeln. Du kannst die Exception in einem "catch"-Block erneut werfen.

Skripte sollten Systemfehler vor Benutzern verbergen. Systemfehler mögen für Programmierer wichtig sein, aber Benutzer interessieren sich nicht dafür. Um es Benutzern leichter zu machen, kannst du eine Exception mit einer benutzerfreundlichen Nachricht erneut werfen:

<?php class customException extends Exception { public function errorMessage() { //Fehlermeldung $errorMsg = $this->getMessage().'ist keine gültige E-Mail-Adresse.'; return $errorMsg; } } $email = "[email protected]"; try { try { //Prüfe, ob "example" in der E-Mail-Adresse enthalten ist if(strpos($email, "example") !== FALSE) { //Wenn es eine ungültige E-Mail-Adresse ist, wirf eine Exception. throw new Exception($email); } } catch(Exception $e) { //Die Ausnahme erneut auslösen throw new customException($email); } } catch (customException $e) { //Benutzerdefinierte Nachricht anzeigen echo $e->errorMessage(); } ?>

Beispielerklärung:

Der obige Code prüft, ob die E-Mail-Adresse die Zeichenkette "example" enthält. Wenn ja, wird die Ausnahme erneut ausgelöst:

  1. Die Klasse customException() wird als Erweiterung der alten Exception-Klasse erstellt. Auf diese Weise erbt sie alle Eigenschaften und Methoden der alten Exception-Klasse.
  2. Erstellen Sie die Funktion errorMessage(). Wenn die E-Mail-Adresse nicht gültig ist, gibt diese Funktion eine Fehlermeldung zurück.
  3. Setze die Variable $email auf eine Zeichenkette, die eine gültige E-Mail-Adresse ist, aber die Zeichenkette "example" enthält.
  4. Der "try"-Block enthält einen weiteren "try"-Block, sodass eine Ausnahme erneut ausgelöst werden kann.
  5. Da die E-Mail die Zeichenkette "example" enthält, wird die Ausnahme ausgelöst.
  6. Der "catch"-Block fängt die Ausnahme ab und löst "customException" erneut aus.
  7. Die "customException" wird abgefangen, und eine Fehlermeldung wird angezeigt.

Wenn die Ausnahme im aktuellen "try"-Block nicht abgefangen wird, sucht sie nach einem catch-Block auf einer höheren Ebene.


Festlegen des Top-Level-Exception-Handlers

Die Funktion set_exception_handler() kann eine benutzerdefinierte Funktion festlegen, die alle nicht abgefangenen Ausnahmen behandelt.

<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Nicht abgefangene Ausnahme ist aufgetreten'); ?>

Die Ausgabe des obigen Codes lautet:

Exception: Uncaught Exception occurred

Im obigen Code gibt es keinen "catch"-Block; stattdessen wird der Ausnahmehandler der obersten Ebene ausgelöst. Diese Funktion sollte verwendet werden, um alle Ausnahmen abzufangen, die nicht abgefangen werden.


Regeln für Ausnahmen

  • Code, der eine Ausnahmebehandlung erfordert, sollte in einen try-Block gesetzt werden, um potenzielle Ausnahmen abzufangen.
  • Jeder try- oder throw-Block muss mindestens einen entsprechenden catch-Block haben.
  • Die Verwendung mehrerer catch-Blöcke kann verschiedene Arten von Ausnahmen abfangen.
  • Eine Ausnahme kann in einem catch-Block innerhalb eines try-Blocks geworfen (erneut geworfen) werden.

Kurz gesagt: Wenn eine Ausnahme geworfen wird, muss sie abgefangen werden.

Weitere Erweiterungen