Dynamic Web Pages: deutschsprachiger PHP Knotenpunkt seit 1999

Dynamic Web Pages : deutschsprachiges PHP-Handbuch : exceptions _

 
  PHP Journal  
  _  
 
<Type Hinting Referenzen in PHP>
Letzte Aktualisierung: Thu, 17 May 2012
 

Kapitel 20. Ausnahmebehandlung

Inhaltsverzeichnis
Ausnahmen erweitern

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

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.

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


<Type Hinting Referenzen in PHP>
Letzte Aktualisierung: Thu, 17 May 2012
 


powered by Hetzner
top Alle Rechte vorbehalten. © Dynamic Web Pages 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 top

Werbung an/aus Werbung aus Werbung an