• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Zend_Exception previous exceptions in php < 5.3.0

mabe

New member
Ich mal wieder.
Seit PHP 5.3.0 die Exception-Klasse akzeptiert einen 3. Parameter: (Exception $previous = null) das habe ich jetzt in Zend_Exception auch für PHP < 5.3 implementiert.

-> http://framework.zend.com/wiki/display/ZFPROP/previous+Exception+on+Zend_Exception+-+Marc+Bennewitz

Das ist nur eine kleine Änderung, die vollkommen Kompatibel mit allen Komponenten und PHP-Versionen sein sollte, aber nur vor zf2.0 sinn macht, da zf 2.0 ja eh nur noch ab 5.3 nutzbar sein wird. Daher wäre ein relativ zügiges Drüberschauen nützlich ;)
 

mabe

New member
Mal nen kleines Beispiel:
PHP:
function writeFile($file, $content) {
    // Schreiben einer Datei
    // wenn fertig, dann umbenennen

    try {
        $tmpFile = '_' . $file . '.tmp';
        if (!@file_put_contents($tmpFile, $content)) {
            throw new Exception('Failed to write file');
        }
        if (!@rename($tmpFile, $file)) {
            throw new Exception('Can\'t rename file');
        }
    } catch (Exception $e) {
        // delete temp file if file wasn't written complete or rename failed
        if (file_exists($tmpFile)) {
            if (!@unlink($tmpFile)) {
                throw new Exception('Can\'t remove temp file', 0, $e);
            }
        }
        throw $e;
    }
}
 
Zuletzt bearbeitet:

KingCrunch

New member
OK, dann weiß ich per
PHP:
try {
  writeFile ($file, $content);
} catch (Exception $e) {
  echo $e->getMessage ();
}
dass das tempfile nicht entfernt werden konnte. Wozu brauch ich dann noch die alte Exception, die nebenbei gesagt mit der aktuellen Exception garnichts zu tun haben, weil die erst überhaupt Verursacher dafür waren, dass die Tempfile überhaupt gelöscht werden soll. Anders: Wenn ich "Failed to write file" lese, weiß ich höchstens, warum die Datei überhaupt gelöscht werden sollte, hilft mir aber nicht weiter, wieso das Löschen fehlschlug.
 

mabe

New member
Wenn du nur die Meldung der letzten Exception ausgibst wirdst du das auch nicht merken, aber wenn du __toString() aufruft wirst du alle Exceptions der Reihenfolge nach aufgelistet bekommen. (Genau wie in PHP 5.3) Dann siehst du, dass das schreiben oder umbenennen fehlgeschlagen ist und evtl. das löschen des tempfiles auch noch fehlgeschlagen ist.

Abgesehen von diesem Beispiel wird ja in den Komponenten oft gesagt, dass sie immer nur eine Art von Exceptions werfen. Aber wenn die Exception in einer anderen von dieser genutzten Komponente auftritt wird die Exception meist kurzerhand umgebogen aller:
PHP:
throw new Zend_MyComponent_Exception ($e->getMessage(), $e->getCode());
was ja auch nicht sinn der Sache sein sollte.

-> Ganz nebenbei ist es auch komisch, wenn die ZF-API in PHP 5.3 anders ist als in PHP < 5.3
 

KingCrunch

New member
Wenn du nur die Meldung der letzten Exception ausgibst wirdst du das auch nicht merken, aber wenn du __toString() aufruft wirst du alle Exceptions der Reihenfolge nach aufgelistet bekommen. (Genau wie in PHP 5.3) Dann siehst du, dass das schreiben oder umbenennen fehlgeschlagen ist und evtl. das löschen des tempfiles auch noch fehlgeschlagen ist.
Dann haben beide Exceptions eventuell die selbe Ursache, aber nicht den selben Verursacher ...
Abgesehen von diesem Beispiel wird ja in den Komponenten oft gesagt, dass sie immer nur eine Art von Exceptions werfen. Aber wenn die Exception in einer anderen von dieser genutzten Komponente auftritt wird die Exception meist kurzerhand umgebogen aller:
OK, aber: Wenn der Fehler "über" Komponente X auftritt, wenn "Y" der Verursacher ist, stellt sich mir die Frage, ob die Exception überhaupt umgebogen werden sollte. Wenn ich in einem Kontroller logge, dieser Logger eine Exception wirft, wieso sollte ich ihn in eine Controller-Exception unbenennen? Schließlich war er doch garnicht Schuld ...
-> Ganz nebenbei ist es auch komisch, wenn die ZF-API in PHP 5.3 anders ist als in PHP < 5.3
Nö, weil das wär eh ZF2 :p :rolleyes:

Geht ja garnich gegen dein Proposal, geht mir eher um das PHP5.3-Konzept der verketteten Exceptions, was ich nicht verstehe :rolleyes: Das Proposal selbst sieht zweckmässig aus ;)
 

Bleistift

Moderator
Geht ja garnich gegen dein Proposal, geht mir eher um das PHP5.3-Konzept der verketteten Exceptions, was ich nicht verstehe :rolleyes: Das Proposal selbst sieht zweckmässig aus ;)
Wurde aus der Java-Welt kopiert. (Throwable(String message, Throwable cause))

Beisst sich übrigens mit dem hier: http://framework.zend.com/wiki/display/ZFPROP/Translateable+Exceptions+for+ZF+-+Thomas+Weidner
// Edit: Wie ich den Kommentaren entnehmen kann, ist dir das selber schon aufgefallen :D
 
Zuletzt bearbeitet:

KingCrunch

New member
Wurde aus der Java-Welt kopiert. (Throwable(String message, Throwable cause))
Heißt nicht, dass ich das da verstanden habe :D

Ah, zum Proposal noch (darum gehts hier ja eigentlich): Wäre meines Erachtens praktischer, wenn zuerst die Aktuelle und erst dann erst die vorhergehenden Exceptions ausgegeben werden, also statts "A next B next C" lieber "C previous B previous A", oder wie macht das PHP?
 

Bleistift

Moderator
Ah, zum Proposal noch (darum gehts hier ja eigentlich): Wäre meines Erachtens praktischer, wenn zuerst die Aktuelle und erst dann erst die vorhergehenden Exceptions ausgegeben werden, also statts "A next B next C" lieber "C previous B previous A", oder wie macht das PHP?
Wurde es nicht genau so implementiert? (Wiki gerade down -.-)

In der Java-Welt wird es so gemacht, wie von dir beschrieben. Das Schlüsselwort heisst da dann "Caused by" ;)
 

KingCrunch

New member
Grad mal getestet: Benutzt zwar auch das Schlüsselwort "Next", geht aber chronologisch rückwärts
Code:
Fatal error: Uncaught exception 'Exception' with message 'First Msg' in /../exception.php:3
Stack trace:
#0 {main}

Next exception 'Exception' with message 'Second Msg' in /../exception.php:5
Stack trace:
#0 {main}
  thrown in /../exception.php on line 5
PHP:
try {
    throw new Exception ('First Msg',1);
} catch (Exception $e) {
    throw new Exception('Second Msg',2,$e);
}
 

mabe

New member
Eigentlich habe ich das genau so umgesetzt wie im PHP 5.3
PHP:
public function __toString() {
    if ($this->getPrevious()) {
        return $this->getPrevious()->__toString() . "\n\nNext " . parent::__toString();
    } else {
        return parent::__toString();
    }
}
 
Zuletzt bearbeitet:
Oben