PHP Dokumentation: Language exceptions
12. Januar 2010 von werner
Ausnahmebehandlung
Inhaltsverzeichnis
PHP 5 hat ein Exceptionmodell ähnlich dem anderer Programmiersprachen. Eine Exception kann in PHP geworfen (throw) und abgefangen (catch) werden. Um das Fangen potentieller Exceptions zu ermöglichen, sollte der jeweilige Code von einem try-Block umschlossen werden. Jeder try-Block muss mindestens einen zugehörigen catch Block besitzen. Mehrere catch-Blöcke können verwendet werden, um verschiedene Klassen von Exceptions abzufangen. Die normale Programmausführung (wenn keine Exception innerhalb des try-Blockes geworfen wird oder kein zur Klasse der geworfenen Exception passendes catch vorhanden ist) wird nach dem letzten in Folge definierten catch-Block fortgesetzt. Exceptions können innerhalb eines catch-Blockes geworfen (oder weitergeworfen) werden.
Wenn eine Exception geworfen wird, wird der Programmcode hinter der auslösenden Anweisung nicht ausgeführt, und PHP versucht, den ersten passenden catch-Block zu finden. Falls eine Exception nicht abgefangen wird, wird ein fataler Fehler mit einer "Uncaught Exception …"-Nachricht ausgegeben, wenn nicht eine Behandlung mittels set_exception_handler() definiert wurde.
Hinweis: Interne PHP-Funktionen verwenden in den meisten Fällen Error-Reporting, nur moderne objektorientierte Extensions nutzen Exceptions. Fehler können allerdings einfach mittels ErrorException in eine Exception umgewandelt werden.
Die Standard PHP Library bietet eine große Anzahl eingebauter und direkt verwendbarer Exceptions.
Beispiel #1 Eine Exception werfen
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division durch Null.');
}
else return 1/$x;
}try {
echo
inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Exception abgefangen: ', $e->getMessage(), "\n";
}// Ausführung fortsetzen
echo 'Hallo Welt';
?>Das oben gezeigte Beispiel erzeugt folgendeAusgabe:
0.2Exception abgefangen: Division durch NullHallo Welt
Beispiel #2 Verschachtelte Exceptions
<?phpclass MyException extends Exception { }class
Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
/* weiterwerfen der Exception */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}$foo = new Test;
$foo->testing();?>Das oben gezeigte Beispiel erzeugt folgendeAusgabe:
string(4) "foo!"