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.
Example#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.
Example#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.
Example#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";
?>