Php 5 hat eine Ausnahmebehandlung ähnlich der anderer Programmiersprachen.
Eine Ausnahme kann in PHP geworfen, abgeprüft und abgefangen werfen. Ein Try
Block muss mindestens einen Catch Block beinhalten. Mehrere Catchblöcke können
verwendet werden, um verschiedene Klassentypen zu fangen; der Programmfluß
wird hinter dem letzten in der Reihe definierten Catchblock fortgesetzt.
Ausnahmen können innerhalb von Catchblöcken geworen werden.
Wenn eine Ausnahme geworfen wird, wird der Programmcode hinter der Anweisung
nicht ausgeführt und PHP versucht den ersten passenden Catchblock 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"; ?>
|
|