Forum und email

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