PHP Try Catch: Definition eigener Exceptions

Mittels Class werden im letzten Beispiel eine selbstdefinierte Exception-Klasse von der in PHP vordefinierten abgeleitet. Darüber hinaus wird eine Klasse implementiert, die den Anfang zu einer Klasse zur Verarbeitung von Brüchen darstellt – lediglich der Construktor zu Initialisierung und eine Methode zur automatischen String-Konvertierung wird hier umgesetzt. Weiter unten werden die zuvor implementierten Klassen instanziiert und entsprechend genutzt. Dabei werden Beispielhaft einige Brüche initialisiert, die mit gültigen – aber auch mit ungültigen Werten – gefüttert werden. Um Auftretende Fehler abzufangen werden die Konstruktoren innerhalb eines Try-Catch-Abschnitts verarbeitet.

<?php
    // Konstante für die Fehlernummer (Error-Code)
    // Ist Hilfreich, wenn die Exception innerhalb des PHP-Code identifiziert werden muss
    define (DIV_ERROR, 1);

    // Individuelle Exception durch Ableitung der vordefinierten Klasse implementieren
    class DivisionDurchNullException extends Exception {
        // Default-Constructor mit Vorgaben zur Fehlermeldung und zum Fehlercode
        // Werden bei der Instanzierung der Exception keine Parameter angegeben,
        // so sind diese Werte bereits vorgegeben.
        public function __construct ($message = 'Division durch Null!', $code = DIV_ERROR) {
            parent :: __construct ($message, $code);
        }
    }

    // Als Beispiel dient folgender Ansatz zur Definition einer Klasse zum Verarbeiten von Brüchen
    class bruch {
        // Variablen (Eigenschaften) zur Speicherung von Zähler und Nenner
        private $zaehler;
        private $nenner;

        // Der Constructor der Klasse Bruch initialisiert eine Instanz
        public function __construct ($zaehler, $nenner = 1) {
            // Schon bei der Initialisierung des Bruchs kann der Fehler auftreten
            // Aus diesem Grunde muss eine Exception geworfen werden, wenn der
            // Parameter zur Angabe des Nenners den Wert 0 enthält.
            if ($nenner == 0)
                // Werfen der Exception mit eine individuellen Fehlermeldung
                // Der Fehlercode wird mit dem Default-Wert belegt.
                throw new DivisionDurchNullException ('Nenner ist Null!');
            // Wenn alles in Ordung ist, können Zähler und Nenner den Variablen
            // der Instanz zugewiesen werden.
            $this->zaehler = $zaehler;
            $this->nenner = $nenner;
        }

        // Methode zur Konvertierung des Bruchs in ein String
        // Wird zur Ausgabe benötigt und automatisch aufgerufen, wenn die
        // Instanz mit echo ausgegeben wird.
        public function __toString () {
            return $this->zaehler . ' / ' . $this->nenner;
        }
    }

    // Exception-Block zum Abfangen von Fehlern bei der Initialisierung von
    // Instanzen der Klasse bruch.
    try {
        // Durch Default-Parameter 5/1 ist OK!
        $f = new bruch (5);
        echo $f . '<br>';
        // Auch 1/2 ist gültig
        $f = new bruch (1, 2);
        echo $f . '<br>';
        // Ohne den Try-Catch-Block wäre hier Schluß und das Script
        // würde mit einem Fehler abgebrochen
        $f = new bruch (1, 0);
        // Aufgrund der Exception wird die folgende Ausgabe nicht erreicht.
        // Statt dessen wird das Script in den Catch-Block eintreten und nach
        // diesem Block mit den darauf folgenden Anweisungen fortfahren.
        echo $f . '<br>';
    } catch (DivisionDurchNullException $e) {
        // Exception ist aufgetreten und eine entsprechende Fehlermeldung
        // samt Trace-String wird ausgegeben.
        echo 'Fehler: ' . $e->getMessage () . '<br>' . $e->getTraceAsString ();
    }
?>

5 / 1
1 / 2
Fehler: Nenner ist Null!
#0 /srv/www/htdocs/_PHPTEST.php(188): bruch->__construct(1, 0)

¬ Tutorials



¬ Insolvenzrecht