Ausnahmen werden verwendet, um den normalen Ablauf eines Skripts zu ändern, wenn ein bestimmte Fehler auftritt.
Was ist eine Ausnahme
Mit PHP 5 kam eine neue objektorientierte Art und Weise mit Fehlern umzugehen.
Ausnahmebehandlung wird verwendet , um den normalen Ablauf der Codeausführung zu ändern , wenn ein bestimmte Fehler (exceptional) Zustand auftritt. Diese Bedingung wird eine Ausnahme genannt.
Dies ist, was normalerweise passiert, wenn eine Ausnahme ausgelöst wird:
- Der aktuelle Codezustand wird gespeichert
- Die Code - Ausführung schaltet auf eine vordefinierte (custom) Ausnahmebehandlungsfunktion
- Je nach Situation, wieder der Handler kann dann die Ausführung von Code-Zustand gespeichert, die Skriptausführung beenden oder das Skript von einem anderen Ort im Code weiter
Wir werden verschiedene Fehlerbehandlungsmethoden zeigen:
- Grundlegende Verwendung von Ausnahmen
- Erstellen einer benutzerdefinierten Exception-Handler
- mehrere Ausnahmen
- Re-Auslösen einer Ausnahme
- Festlegen einer Top-Level-Exception-Handler
Note: Ausnahmen sollten nur mit Fehlerbedingungen verwendet werden und sollen nicht verwendet werden an einem bestimmten Punkt in dem Code an einem anderen Ort zu springen.
Grundlegende Verwendung von Ausnahmen
Wenn eine Ausnahme ausgelöst wird, nachdem der Code nicht ausgeführt wird und wird PHP versuchen , den passenden zu finden "catch" Block.
Wenn eine Ausnahme nicht abgefangen wird, wird ein fataler Fehler mit einer ausgestellt werden "Uncaught Exception" Nachricht.
Versuchen sie, ohne es zu fangen, eine Ausnahme zu werfen:
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception
checkNum(2);
?>
Der obige Code wird einen Fehler wie diese:
Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
Versuchen Sie, werfen und fangen
Um den Fehler aus dem obigen Beispiel zu vermeiden, müssen wir den richtigen Code erstellen, eine Ausnahme zu behandeln.
Proper Ausnahmecode sollte folgendes beinhalten:
- Versuchen - eine Funktion einer Ausnahme unter Verwendung in einem sein sollte "try" Block. Wenn die Ausnahme nicht ausgelöst wird, wird auch weiterhin der Code als normal. Wenn jedoch die Ausnahme auslöst, wird eine Ausnahme "thrown"
- Werfen - Dies ist, wie Sie eine Ausnahme auslösen. Jeder "throw" muss mindestens eine haben "catch"
- Fangen - A "catch" Block eine Ausnahme abruft und erzeugt ein Objekt enthält , das Ausnahmeinformationen
Versuchen sie eine Ausnahme mit gültigem Code auslösen:
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception in a "try" block
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
Der obige Code wird einen Fehler wie diese:
Message: Value must be 1 or below
Beispiel erläutert werden:
Der obige Code löst eine Ausnahme und fängt ihn:
- Die checkNum() Funktion wird erzeugt. Es wird überprüft, ob eine Zahl größer als 1 ist Wenn ja, wird eine Ausnahme ausgelöst
- Die checkNum() Funktion wird in einem gerufenen "try" Block
- Die Ausnahme in der checkNum() Funktion wird ausgelöst ,
- Der "catch" Block ruft die Ausnahme und erzeugt ein Objekt ($e) die Ausnahmeinformationen enthält ,
- Die Fehlermeldung von der Ausnahme wird durch den Aufruf hallt $e-> getMessage() aus dem Ausnahme - Objekt
Allerdings ist ein Weg , um die zu bekommen "every throw must have a catch" Regel ist ein Top - Level - Exception - Handler zu setzen Fehler zu behandeln , die durch rutschen.
Erstellen einer benutzerdefinierten Exception-Klasse
Um eine benutzerdefinierte Exception-Handler erstellen Sie eine Sonderklasse mit Funktionen erstellen müssen, die aufgerufen werden können, wenn eine Ausnahme in PHP auftritt. Die Klasse muss eine Verlängerung der Ausnahmeklasse sein.
Die benutzerdefinierte Exception-Klasse erbt die Eigenschaften von PHP-Exception-Klasse und Sie können benutzerdefinierte Funktionen hinzufügen.
Ermöglicht eine Ausnahmeklasse zu erstellen:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e) {
//display custom message
echo $e->errorMessage();
}
?>
Die neue Klasse ist eine Kopie der alten Ausnahmeklasse mit einem Zusatz der errorMessage() Funktion. Da es sich um eine Kopie der alten Klasse ist, und es erbt die Eigenschaften und Methoden aus der alten Klasse, können wir die Ausnahmeklasse Methoden wie verwenden getLine() und getFile() und getMessage() .
Beispiel erläutert werden:
Der obige Code löst eine Ausnahme und fängt ihn mit einer benutzerdefinierten Ausnahmeklasse:
- Die customException() der Klasse wird als Erweiterung der alten Ausnahmeklasse erstellt. Auf diese Weise erbt es alle Methoden und Eigenschaften von der alten Ausnahmeklasse
- Die errorMessage() Funktion wird erzeugt. Diese Funktion gibt eine Fehlermeldung, wenn eine E-Mail-Adresse ist ungültig
- Der $ E-Mail-Variable wird in einen String gesetzt, der keine gültige E-Mail-Adresse ist
- Der "try" Block wird ausgeführt , und eine Ausnahme ausgelöst wird , da die E-Mail - Adresse ist ungültig
- Der "catch" Block fängt die Ausnahme und zeigt die Fehlermeldung
mehrere Ausnahmen
Es ist möglich, dass ein Skript mehrere Ausnahmen zu verwenden, um mehrere Bedingungen zu überprüfen.
Es ist möglich, mehrere if..else Blöcke, einen Schalter oder nisten mehrere Ausnahmen zu verwenden. Diese Ausnahmen können verschiedene Ausnahmeklassen verwenden und verschiedene Fehlermeldungen zurück:
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e) {
echo $e->errorMessage();
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
Beispiel erläutert werden:
Der obige Code testet zwei Bedingungen und löst eine Ausnahme, wenn eine der Bedingungen nicht erfüllt ist:
- Die customException() der Klasse wird als Erweiterung der alten Ausnahmeklasse erstellt. Auf diese Weise erbt es alle Methoden und Eigenschaften von der alten Ausnahmeklasse
- Die errorMessage() Funktion wird erzeugt. Diese Funktion gibt eine Fehlermeldung, wenn eine E-Mail-Adresse ist ungültig
- Der $ E - Mail - Variable wird in einen String gesetzt, der eine gültige E - Mail - Adresse ist, enthält jedoch die Zeichenfolge "example"
- Der "try" Block wird ausgeführt , und eine Ausnahme wird nicht auf den ersten Zustand geworfen
- Die zweite Bedingung löst eine Ausnahme , da die E-Mail enthält die Zeichenkette "example"
- Der "catch" Block fängt die Ausnahme und zeigt die korrekte Fehlermeldung
Wenn die Ausnahme ausgelöst wurden der Klasse customException und es gab keine customException fangen, nur die Basis Ausnahme zu fangen, würde die Ausnahme dort behandelt werden.
Re-Auslösen von Ausnahmen
Manchmal, wenn eine Ausnahme ausgelöst wird, können Sie ihn zu handhaben anders als der Standard-Weg. Es ist möglich , eine Ausnahme ein zweites Mal innerhalb eines werfen "catch" Block.
Ein Skript soll Systemfehler von den Benutzern verbergen. Systemfehler für den Codierer wichtig sein, können aber nicht von Interesse sind für den Benutzer. Um die Dinge für den Benutzer einfacher machen können Sie die Ausnahme mit einer benutzerfreundlichen Nachricht erneut werfen:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "[email protected]";
try {
try {
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e) {
//re-throw exception
throw new customException($email);
}
}
catch (customException $e) {
//display custom message
echo $e->errorMessage();
}
?>
Beispiel erläutert werden:
Der obige Code prüft , ob die E - Mail-Adresse enthält die Zeichenfolge "example" in ihm, wenn es der Fall ist, wird die Ausnahme erneut geworfen:
- Die customException() der Klasse wird als Erweiterung der alten Ausnahmeklasse erstellt. Auf diese Weise erbt es alle Methoden und Eigenschaften von der alten Ausnahmeklasse
- Die errorMessage() Funktion wird erzeugt. Diese Funktion gibt eine Fehlermeldung, wenn eine E-Mail-Adresse ist ungültig
- Der $ E - Mail - Variable wird in einen String gesetzt, der eine gültige E - Mail - Adresse ist, enthält jedoch die Zeichenfolge "example"
- Der "try" enthält Block einen anderen "try" Block , um es möglich zu machen , die Ausnahme erneut zu werfen
- Die Ausnahme wird ausgelöst, da die E-Mail die Zeichenfolge enthält "example"
- Der "catch" Block fängt die Ausnahme und Wieder wirft eine "customException"
- Die "customException" wird gefangen und zeigt eine Fehlermeldung
Wenn die Ausnahme nicht in seinem aktuellen gefangen wird "try" Block, wird es für einen catch - Block auf der Suche "higher levels" .
Legen Sie eine Top-Level-Exception Handler
Die set_exception_handler() Funktion setzt eine benutzerdefinierte Funktion , um alle nicht abgefangene Ausnahmen zu handhaben .
<?php
function myException($exception)
{
echo "<b>Exception:</b> " . $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
Der Ausgang des obigen Code sollte wie folgt sein:
Exception: Uncaught Exception occurred
In dem obigen Code gab es keinen "catch" Block. Stattdessen löste die Top-Level-Exception-Handler. Diese Funktion soll verwendet werden, nicht abgefangene Ausnahmen zu fangen.
Regeln für Ausnahmen
- Code kann in einem try-Block umgeben sein, um potenzielle Ausnahmen zu fangen
- Jeder Versuch Block oder "throw" muss mindestens einen entsprechenden catch - Block haben
- Mehrere catch-Blöcke können verschiedene Klassen von Ausnahmen zu fangen verwendet werden
- Ausnahmen können ausgelöst werden (or re-thrown) in einem catch - Block in einem Try - Block
Eine einfache Regel: Wenn Sie etwas werfen, haben Sie es zu fangen.