PHP Handbuch
Zurück |  | Weiter

# Kapitel 20. Ausnahmebehandlung

PHP 5 hat eine Ausnahmebehandlung ähnlich der anderer Programmiersprachen. Eine Ausnahme kann in PHP geworfen(`throw`) und abgefangen (`catch`) werden. Code kann von einem `try`- Block umschlossen werden, um das Fangen von möglichen Exceptions zu ermöglichen. Jeder `try`-Block muss mindestens einen zugehörigen `catch` Block besitzen. Mehrere `catch`-Blöcke können verwendet werden, um verschiedene Klassen von Ausnahmen abzufangen. Normale Programmausführung (wenn keine Ausnahme innerhalb des `try`-Blockes geworfen wird oder kein zur Klasse der Ausnahme passendes catch vorhanden ist) wird nach dem letzten in Folge definierten catch-Block fortgesetzt. Ausnahmen können innerhalb eines `catch`-Blockes geworfen werden.

Wenn eine Ausnahme geworfen wird, wird der Programmcode hinter der Anweisung nicht ausgeführt und PHP versucht den ersten passenden `catch`- Block zu finden. Falls eine Ausnahme nicht abgefangen wird, wird ein fataler Fehler mit einer "`Uncaught Exception ...`"-Nachricht ausgegeben, wenn nicht eine Behandlung mittels set_exception_handler() definiert wurde.

Beispiel 20-1. Eine Ausnahme werfen
`<?php try { $error = 'Werfe immer diesen Fehler'; throw new Exception($error); //Einer Ausnahme folgender Code wird nicht ausgeführt echo 'Keine Ausführung'; } catch (Exception $e) { echo 'Ausnahme gefangen: ', $e->getMessage(), "\n"; } // Ausführung fortsetzen echo 'Hallo Welt'; ?>`

# Ausnahmen erweitern

Eine benutzerdefinierte Ausnahmeklasse kann definiert werden, indem man die eingebaute Ausnahmeklasse ableitet. Die unten angegebenen Member und Eigenschaften zeigen, was innerhalb der von der eingebauten Klasse Exception abgeleiteten Klasse verfügbar ist.

Beispiel 20-2. Die eingebaute Ausnahmeklasse
`<?php class Exception { protected $message = 'Unknown exception'; // Ausnahmemitteilung protected $code = 0; // Benutzerdefinierter Code protected $file; // Quelldateiname der Ausnahme protected $line; // Quelldateizeile der Ausnahme function __construct($message = null, $code = 0); final function getMessage(); // Mitteilung der Ausnahme final function getCode(); // Code der Ausnahme final function getFile(); // Quelldateiname final function getLine(); // Quelldateizeile final function getTrace(); // Array mit Ablaufverfolgung final function getTraceAsString(); // Formatierter String mit // Ablaufverfolgung /* Überschreibbar */ function __toString(); // Formatierter String für // Ausgabe } ?>`

Wenn eine Klasse die eingebaute Klasse Exception erweitert und den Konstructor neu definiert, wird es dringend empfohlen, dass dieser parent::__construct() aufruft, um sicherzustellen, dass alle verfügbaren Daten korrekt zugewiesen wurden. Die magische Methode __toString() kann überschrieben werden, um eine maßgeschneiderte Ausgabe anzubieten, wenn das Objekt durch eine Zeichenkette repräsentiert werden soll.

Beispiel 20-3. Die Ausnahmeklasse erweitern
`<?php /** * Eine maßgeschneiderte Ausnahmeklasse definieren */ class MyException extends Exception { // Die Ausnahmemitteilung neu definieren, damit diese nicht optional ist public function __construct($message, $code = 0) { // etwas Code // sicherstelen, dass alles korrekt zugewiesen wird parent::__construct($message, $code); } // maßgeschneiderte Stringdarstellung des Objektes public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } public function customFunction() { echo "Eine eigene Funktion dieses Ausnahmetypen\n"; } } /** * Erzeuge eine Klasse, um die Ausnahme zu testen */ class TestException { public $var; const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2; function __construct($avalue = self::THROW_NONE) { switch ($avalue) { case self::THROW_CUSTOM: // eigene Ausnahme verwfen throw new MyException('1 ist ein ungültiger Parameter', 5); break; case self::THROW_DEFAULT: // Vorgabe werfen throw new Exception('2 ist kein zugelassener Parameter', 6); break; default: // Keine Ausnahme, das Objekt wird erzeugt $this->var = $avalue; break; } } } // Beispiel 1 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (MyException $e) { // Wird gefangen echo "Meine Ausnahme gefangen\n", $e; $e->customFunction(); } catch (Exception $e) { // Übersprungen echo "Vorgegebene Ausnahme gefangen\n", $e; } // Ausführung fortsetzen var_dump($o); echo "\n\n"; // Beispiel 2 try { $o = new TestException(TestException::THROW_DEFAULT); } catch (MyException $e) { // Dieser typ passt nicht echo "Meine Ausnahme gefangen\n", $e; $e->customFunction(); } catch (Exception $e) { // Wird gefangen echo "Vorgegebene Ausnahme gefangen\n", $e; } // Ausführung fortsetzen var_dump($o); echo "\n\n"; // Beispiel 3 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (Exception $e) { // Wird gefangen echo "Vorgegebene Ausnahme gefangen\n", $e; } // Ausführung fortsetzen var_dump($o); echo "\n\n"; // Beispiel 4 try { $o = new TestException(); } catch (Exception $e) { // Übersprungen, wird nicht ausgeführt echo "Default Exception caught\n", $e; } // Ausführung fortsetzen var_dump($o); echo "\n\n"; ?>`

Zurück | Zum Anfang | Weiter
Type Hinting | Nach oben | Referenzen in PHP