PHP5 Exceptions

nautiLus`

Erfahrenes Mitglied
Hallo, ich habe eine Frage zu PHP5 Exceptions:

laut
Code:
Reflection::export(new ReflectionClass('Exception'));
wird mir folgendes ausgegeben:

Code:
Class [ <internal> class Exception ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [6] {
    Property [ <default> protected $message ]
    Property [ <default> private $string ]
    Property [ <default> protected $code ]
    Property [ <default> protected $file ]
    Property [ <default> protected $line ]
    Property [ <default> private $trace ]
  }

  - Methods [9] {
    Method [ <internal> final private method __clone ] {
    }

    Method [ <internal> <ctor> <visibility error> method __construct ] {

      - Parameters [2] {
        Parameter #0 [ <required> $message ]
        Parameter #1 [ <required> $code ]
      }
    }

    Method [ <internal> final public method getMessage ] {
    }

    Method [ <internal> final public method getCode ] {
    }

    Method [ <internal> final public method getFile ] {
    }

    Method [ <internal> final public method getLine ] {
    }

    Method [ <internal> final public method getTrace ] {
    }

    Method [ <internal> final public method getTraceAsString ] {
    }

    Method [ <internal> public method __toString ] {
    }
  }
}

Das heißt die Exception Klasse hat eine __clone() Methode...

Jetzt versuche ich ein Exception Objekt zu klonen:

Code:
try {
 throw new Exception("Fehler");
} catch(Exception $e) {
  echo $e->getMessage();
  $a = clone $e;
}

aber bekomme einen Fehler:

Code:
Fatal error: Trying to clone an uncloneable object of class Exception in ...

Kann es sein, dass diese integrierte Methode dafür angelegt wurde, dass diese dafür zuständig ist Kopien zu unterbinden? Wenn nein, wie lege ich dann eine Kopie mittels clone() an?

Danke, Nauti
 
Hi, danke mal dafür, aber das war mir eh schon klar.
Ich denke mir, dass die __clone() Methode dafür gemacht ist, dass das Kopieren einer Exception Objektinstanz damit verhindert wird.

Code:
try {
 throw new Exception("Fehler");
} catch(Exception $e) {
  echo $e->getMessage();
  $a = clone $e;
}

$a = clone $e; ruft aso __clone() auf und diese scheint das Klonen zu verhindern, weils ja nicht geht wie man oben bei der Meldung sieht. Und das ist eben das was ich genauer erforschen will... MMn sind also Exception Objekte und abgeleitete Exception Objekte nicht klonbar.
 
Scheint so zu sein....

Wenn ich da etwas drüber nachdenke macht es ja eigentlich auch nicht viel Sinn eine Exception zu klonen, weil diese ja immer den Zustand eines Systems repräsentiert und Du ja nur diesen Zustand verändern kannst, nicht aber die Meldung das dieser Zustand eingetreten ist, oder?

Die Änderung des Zustands würde durch das normale weiterlaufen des Programms, nach Abarbeitung der Exception, erfolgen, oder dadurch, dass eine neue Exception geworfen wird, die nun einen anderen (kritischen) Zustand repräsentiert.

Wenn's doch Sinn macht, lasse ich mich gerne davon überzeugen :)
 
Zurück