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'; ?>
|
|
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"; ?>
|
|