PHP Ausnahmebehandlung
Ausnahme zum Ändern der Skriptfehler tritt auf, wenn der normale Fluss angegeben.
Was ist nicht normal
PHP 5 bietet eine neue Methode zur Fehlerbehandlung objektorientiert.
Die Ausnahmebehandlung wird verwendet, wenn der angegebene Fehler (Ausnahme) tritt auf den normalen Ablauf des Skripts zu ändern. Diese Bedingung wird eine Ausnahme genannt.
Wenn eine Ausnahme ausgelöst wird, in der Regel kommt es:
- Aktuelle Codezustand wird gespeichert
- Codeausführung ist mit einer vordefinierten (custom) Exception-Handler-Funktion eingeschaltet
- In einigen Fällen kann der Prozessor aus dem in der Statuscode gespeicherten Code neu gestartet werden, beenden Sie die Skriptausführung oder das Skript von einem anderen Standort Code weiter
Wir werden verschiedene Fehlerbehandlungsmethoden zeigen:
- Grundlegende Verwendung Ausnahme
- Erstellen einer benutzerdefinierten Exception-Handler
- Mehrere Ausnahmen
- Rethrows
- Top-Level-Exception-Handler-Set
Hinweis: Ausnahmen nur im Fehlerfall verwendet werden soll, sollte es nicht in einem bestimmten Punkt verwendet werden , um eine andere Stelle im Code zu springen.
Grundlegende Verwendung Ausnahme
Wenn eine Ausnahme ausgelöst wird, wird der nachfolgende Code nicht fortgesetzt werden, wird PHP versuchen, die passende "fangen" Block zu finden.
Wenn eine Ausnahme nicht abgefangen wird, aber nicht mit der Verwendung von set_exception_handler () für die entsprechende Behandlung, dann ist ein schwerwiegender Fehler (Fatal Error) auftritt, und der Ausgang "abgefangene Ausnahme" (abgefangene Ausnahme) Fehlermeldungen.
Lassen Sie uns versuchen, eine Ausnahme zu werfen, aber es nicht zu fangen:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
Der obige Code wird einen Fehler ähnlich wie diese bekommen:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7
Versuchen Sie, werfen und zu fangen
Um Fehler zu vermeiden in dem obigen Beispiel erscheinen, müssen wir den entsprechenden Code zu erstellen Ausnahmen zu behandeln.
Der richtige Umgang Ausnahmecode sollte folgendes beinhalten:
- Versuchen Sie - abnormale Funktion verwenden, sollten innerhalb des "Try" Block befinden. Wenn keine Ausnahme ausgelöst wird, wird der Code wie gewohnt fortsetzen. Wenn jedoch eine Ausnahme ausgelöst wird, wird eine Ausnahme geworfen.
- Werfen - in, wie die Ausnahmebestimmungen auszulösen. Jeder "werfen" muss mindestens ein "fangen" entsprechen.
- Fangen - "fangen" Block fängt die Ausnahme und erstellt ein Objekt, mit dem Ausnahmemeldung.
Lassen Sie eine Ausnahme auslösen:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
Der obige Code wird einen Fehler wie diese:
Message: 变量值必须小于等于 1
Beispiele erläutern:
Der obige Code löst eine Ausnahme aus und fängt ihn:
- Erstellen Sie checkNum () Funktion. Es stellt fest, ob eine Zahl größer als eins ist. Wenn ja, wird eine Ausnahme ausgelöst.
- Rufen Sie checkNum () Funktion in einem "Try" Block.
- checkNum () Funktion Ausnahme ausgelöst.
- "Catch" Block erhält die Ausnahme und erstellt ein Objekt, das Informationen über die Ausnahme ($ e) enthält.
- Durch den Aufruf von $ e- von dieser Ausnahme Objekte> getMessage (), die Ausgabe von der Fehlermeldung für die Ausnahme.
Um jedoch die "jeder Wurf einer Fangmenge entsprechen müssen" folgen Prinzip können Sie einrichten verpasste eine Top-Level-Exception-Handler auf Fehler behandeln.
Erstellen Sie eine benutzerdefinierte Exception-Klasse
eine benutzerdefinierte Exception-Handler zu erstellen ist sehr einfach. Wir erstellen Sie einfach eine Sonderklasse, wenn eine Ausnahme in PHP auftritt, können Sie seine Funktionen aufrufen. Die Klasse muss eine Verlängerung der Ausnahmeklasse sein.
Die benutzerdefinierte Exception-Klasse erbt alle Attribute in der PHP-Exception-Klasse definiert sind, können Sie benutzerdefinierte Funktionen hinzufügen möchten.
Beginnen Sie mit der Ausnahmeklassen zu erstellen:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "[email protected]"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Diese neue Klasse ist eine Kopie der alten Ausnahmeklasse plus errormessage () Funktion. Da es sich um eine Kopie der alten Klasse ist, so dass es von der alten Klasse Eigenschaften und Methoden erbt, können wir die Ausnahmeklasse Methoden, wie getLine (), getFile () und getMessage () verwenden.
Beispiele erläutern:
Der obige Code löst eine Ausnahme, und durch eine benutzerdefinierte Ausnahmeklasse, es zu erfassen:
- customException () der Klasse als Erweiterung der alten Ausnahmeklasse zu erstellen. Damit es erbt alle Attribute und Methoden der alten Ausnahmeklasse.
- Erstellen errormessage () Funktion. Wenn die E-Mail-Adresse ungültig ist, gibt die Funktion eine Fehlermeldung.
- Die $ E-Mail-Variable auf ungültige E-Mail-Adresse Zeichenfolge festgelegt.
- Die Umsetzung des "Try" Block, da die E-Mail-Adresse ist nicht gültig, und daher löst eine Ausnahme.
- "Catch" Block die Ausnahme und zeigt eine Fehlermeldung zu fangen.
Mehrere Ausnahmen
Sie können mehrere Ausnahmen als Skript verwenden eine Vielzahl von Situationen zu erkennen.
Sie können mehrere if..else Block oder einen Codeblock Switch oder Nest mehrere Ausnahmen verwenden. Diese Ausnahmen können verschiedene Ausnahmeklassen verwenden und verschiedene Fehlermeldungen zurück:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "[email protected]"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { throw new Exception("$email 是 example 邮箱"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Beispiele erläutern:
Der obige Code prüft zwei Bedingungen, wenn eine Bedingung nicht erfüllt, dann eine Ausnahme aus:
- customException () der Klasse als Erweiterung der alten Ausnahmeklasse zu erstellen. Damit es erbt alle Attribute und Methoden der alten Ausnahmeklasse.
- Erstellen errormessage () Funktion. Wenn die E-Mail-Adresse ungültig ist, gibt die Funktion eine Fehlermeldung.
- Die $ E-Mail-Variable auf eine Zeichenfolge festgelegt, dass eine gültige E-Mail-Adresse ist, enthält jedoch die Zeichenfolge "Beispiel".
- Die Umsetzung von "versuchen" Codeblock in der ersten Bedingung wird keine Ausnahme ausgelöst.
- Da die E-Mail die Zeichenfolge "Beispiel" enthält, löst die zweite Bedingung eine Ausnahme.
- "Catch" Block fängt die Ausnahme und zeigt die entsprechende Fehlermeldung.
Wenn customException Klasse Ausnahme wird ausgelöst, aber nicht gefangen customException, erfasst nur eine Basis Ausnahme, wo die Griff Ausnahmen.
Rethrows
Manchmal, wenn eine Ausnahme ausgelöst wird, können Sie möchten aus dem Standard-Weg abweichen, es zu handhaben. Mai wieder in einem "fangen" Block geworfen werden.
Das Skript sollte von den Benutzersystemfehler ausgeblendet werden. Für Programmierer, Systemfehler von Bedeutung sein können, aber der Benutzer ist nicht an ihnen interessiert. Um es einfacher für die Benutzer zu verwenden, können Sie eine Ausnahme wieder mit relativ benutzerfreundlich Nachricht werfen:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "[email protected]"; try { try { // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new Exception($email); } } catch(Exception $e) { // 重新抛出异常 throw new customException($email); } } catch (customException $e) { // 显示自定义信息 echo $e->errorMessage(); } ?>
Beispiele erläutern:
Der obige Code wird in der E-Mail-Adresse erkannt wird, wenn es die Zeichenfolge "Beispiel" enthält. Wenn es wieder, wird eine Ausnahme ausgelöst:
- customException () der Klasse als Erweiterung der alten Ausnahmeklasse zu erstellen. Damit es erbt alle Attribute und Methoden der alten Ausnahmeklasse.
- Erstellen errormessage () Funktion. Wenn die E-Mail-Adresse ungültig ist, gibt die Funktion eine Fehlermeldung.
- Die $ E-Mail-Variable auf eine Zeichenfolge festgelegt, dass eine gültige E-Mail-Adresse ist, enthält jedoch die Zeichenfolge "Beispiel".
- "Try" Block enthält einen weiteren "versuchen" Code-Block, so dass Sie eine Ausnahme wieder werfen.
- Da die E-Mail die Zeichenfolge "Beispiel" enthält und somit eine Ausnahme auslösen.
- "Catch" Block die Ausnahme und wieder werfen "customException" zu fangen.
- Captured "customException" und zeigt eine Fehlermeldung.
Wenn eine Ausnahme nicht in der aktuellen "versuchen" Block abgefangen wird, sieht es für den catch-Block auf einer höheren Ebene.
Top-Level-Exception-Handler-Set
set_exception_handler () Funktion kann so eingestellt werden, um alle abgefangene Ausnahme von benutzerdefinierten Funktionen zu handhaben.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
Die Ausgabe des Codes ist oben, wie folgt:
Exception: Uncaught Exception occurred
In dem obigen Code, gibt es keine "fangen" Block, aber die Top-Level-Exception-Handler ausgelöst. Diese Funktion sollte verwendet werden, um alle abgefangene Ausnahme zu erfassen.
Ausnahmeregel
- Ausnahmebehandlung Code muss in einem Try-Block platziert werden, um mögliche Ausnahmen zu fangen.
- Jeder Wurf oder Codeblock versuchen müssen mindestens einen entsprechenden catch-Block haben.
- Sie können mehrere catch-Blöcke verwenden, um verschiedene Arten von Ausnahmen fangen.
- innerhalb des try-Code-Block wirft Block catch (wieder geworfen) Ausnahme werden.
Kurz gesagt: Wenn Sie eine Ausnahme auslösen, müssen Sie ihn zu fangen.