[PHP5] Exception-Handling: Verständnis-Frage(n)

PlaciD

Böhser Onkel
ID: 55555
L
11 Februar 2007
722
105
Hallo,

ich beschäftige mich gerade mit PHP5 und infolge dessen auch mit dem Exception-Handling. Klingt alles ganz logisch, nur eine Frage habe ich:
Kann ich geworfene Exceptions auch weiterreichen innerhalb von Methoden? Folgendes Beispiel:

Code:
class test{
 function testen($allowed){
  if(!$allowed)
   throw new Exception("Du darfst nicht testen");
  }
 }

 function ich_teste(){
  $this->testen(false);
 }
 
 function chef_testet(){
  $this->testen(true);
 }
}

$der_tester = new test();
try{
 $der_tester->ich_teste();
} catch(Exception $ex){
 print $ex->getMessage();
}

So ähnlich würde ich das in Java machen. Ich gebe also die in "testen" geworfene Exception über die aufrufende Methode "ich_teste" weiter an dessen aufrufendes Objekt, da ich ja je nach Situation anders mit der Exception verfahren will. Ist dies genauso möglich wie in Java oder würde der o.g. Code einen Fehler erzeugen (ich kann aktuell nicht testen, würde das aber für's Verständnis dennoch gerne wissen)?

Danke und Grüße,
PlaciD
 
Zuletzt bearbeitet:
Exceptions werden solange "durchgereicht" bis sie mittels try catch abgefangen werden. Also ja das funktioniert so wie du dir das vorstellst...
 
Exceptions werden solange "durchgereicht" bis sie mittels try catch abgefangen werden. Also ja das funktioniert so wie du dir das vorstellst...

Super :)

EDIT: Ganz vergessen: Die Ablauf-Routine wird aber dennoch an der Stelle unterbrochen und die Exception nach oben durchgereicht? Nicht das das einfach weiterläuft.

D.h. aber auch, dass ich die Exception garnicht abfangen muss, wenn ich nicht möchte? Was passiert dann an oberster Stelle? Bricht das Programm einfach ab?

PlaciD
 
Super :)

EDIT: Ganz vergessen: Die Ablauf-Routine wird aber dennoch an der Stelle unterbrochen und die Exception nach oben durchgereicht? Nicht das das einfach weiterläuft.

D.h. aber auch, dass ich die Exception garnicht abfangen muss, wenn ich nicht möchte? Was passiert dann an oberster Stelle? Bricht das Programm einfach ab?

PlaciD

Wenn eine Exception ausgelöst wird ist das nächste entweder das Scriptende oder das Abgefangen. Also würdest du jetzt in ich_teste() noch Code dran hängen würde der nicht ausgeführt. Und wenn du eine Exception nicht abfängst erhälst hast du ne uncaught exception in form eines fatalen Fehlers. Kannst aber auch ein default Exception handler definieren... da wird das Script zwar auch beendet, aber du kannst die Ausgabe der Exception beeinflussen.
 
Wenn eine Exception ausgelöst wird ist das nächste entweder das Scriptende oder das Abgefangen. Also würdest du jetzt in ich_teste() noch Code dran hängen würde der nicht ausgeführt. Und wenn du eine Exception nicht abfängst erhälst hast du ne uncaught exception in form eines fatalen Fehlers.

Das hört sich doch sehr gut an. Damit kann ich leben. Eigentlich ist es genau das, was ich brauche.

Schade ist lediglich, dass kein throws Exception bei der Methode benötigt wird. Das hat Java doch ein bisschen übersichtlicher gemacht, gerade wenn man in größeren Konstrukten 3-4 Methoden aus anderen Klassen aufruft, die verschiedene Exceptions werfen.

Danke dir auf jeden Fall, du hast mir sehr weitergeholfen.

PlaciD
 
Schade ist lediglich, dass kein throws Exception bei der Methode benötigt wird. Das hat Java doch ein bisschen übersichtlicher gemacht, gerade wenn man in größeren Konstrukten 3-4 Methoden aus anderen Klassen aufruft, die verschiedene Exceptions werfen.

*gg*
genau das gleiche habe ich auch schon bemängelt, man merkt eben schon, dass das OOP von Java fortschrittlicher ist
 
*gg*
genau das gleiche habe ich auch schon bemängelt, man merkt eben schon, dass das OOP von Java fortschrittlicher ist

Ich würde nicht sagen, es ist fortschrittlicher. PHP verfolgt einfach eine ganz andere Strategie. Das merkt man an vielen Stellen, wo PHP einfach ganz anders denkt als Java. Wenn ich schon wieder diese Typ-unsicheren Variablen/Methoden sehe, kriege ich das kotzen.

PlaciD
 
[...] aber die Möglichkeit für funktionen typsicherheit zu nutzen wäre sau geil -> overloading

Mich stört die Typenunsicherheit auch nicht so sonderlich, entweder ich lege den typ fest oder ich prüfe es :D. Für funktionen gibt es ja, zumindest für die Typsicherheit bei Arrays und Objekte, etwas:

PHP:
function foo($bar, array $arr, class_name $objOfClass) {
  // $bar kann alles sein,
  // $arr kann nur ein Array sein
  // $objOfClass kann nur ein Objekt der Klasse class_name sein
  

}
 
Mich stört die Typenunsicherheit auch nicht so sonderlich, entweder ich lege den typ fest oder ich prüfe es :D. Für funktionen gibt es ja, zumindest für die Typsicherheit bei Arrays und Objekte, etwas:
noch nie in den Genuss von Overloading gekommen :p
ein Konstruktor einer Klasse zB von dem es 8 versch. Permutationen geben kann, prüf das mal in PHP^^


Mich stört die Typenunsicherheit auch nicht so
PHP:
// $objOfClass kann nur ein Objekt der Klasse class_name sein
[/QUOTE]
nicht ganz, es kann auch ein Objekt einer klasse sein welches irgendwann von class_name geerbt hat oder ein objekt einer klasse sein, welches das interface class_name implementiert.
Achso, KlassenNamen schreibt man groß ;)