Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Fatal Error und der Skriptabbruch

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Fatal Error und der Skriptabbruch

    Hallo,

    ich hatte erst gestern das Problem, dass sich mal wieder irgendwo im Code eine Exception, die nicht gefangen wurde, im Destruktor einer Klasse befand. Das ganze ergibt ja nen Fatal Error und bei einem Fatal Error sollte ja das Skript abgebrochen werden. Nun ergibt aber
    PHP-Code:
    <?php
    class {
        private 
    $a;
        public function 
    setA($a) {
            
    $this->$a;
        }

        public function 
    getA() {
            return 
    $this->a;
        }

        public function 
    __construct($a) {
            
    $this->setA($a);
        }

        public function 
    __destruct() {
            if (
    $this->!= 0) {
                throw new 
    Exception('LANGWEILIG!');
            }
        }
    }
    $aObj = new A(1);
    echo 
    'aloha';
    folgendes Ergebnis:
    Code:
    aloha Fatal error: Exception thrown without a stack frame in Unknown on line 0
    Liegt das daran, dass der Fatal Error erst auftritt wenn sich das Skript schon beendet, da ja im Destruktor usw., oder liegt es an etwas ganz anderem?


  • #2
    Hinweis: Der Versucht eine Exception aus einem Destruktor (der in der Beendigungsphase des Skripts aufgerufen wurde) heraus zu werfen wird einen fatalen Fehler auslösen.
    PHP: Konstruktoren und Destruktoren - Manual
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Schön dass man den Post auch komplett liest.

      Kommentar


      • #4
        Zitat von peaceman Beitrag anzeigen
        ich hatte erst gestern das Problem, dass sich mal wieder irgendwo im Code eine Exception, die nicht gefangen wurde, im Destruktor einer Klasse befand. Das ganze ergibt ja nen Fatal Error und bei einem Fatal Error sollte ja das Skript abgebrochen werden
        Zitat von peaceman Beitrag anzeigen
        aloha Fatal error: Exception thrown without a stack frame in Unknown on line 0
        Du beobachtest/vergleichst zwei Dinge, die nichts miteinander zu tun haben. (oder ich verstehe die Problemstellung falsch)

        Zu 1: Eine nicht abgefangene Exception endet immer in einem fatal error: uncaught exception.

        Zu 2: Eine Exception im Destruktor führt immer zu einem fatal error (siehe oben)

        Wann wird der Destruktor ausgeführt?
        PHP: Konstruktoren und Destruktoren - Manual
        Die Destruktormethode wird aufgerufen, sobald alle Referenzen auf ein bestimmtes Objekt entfernt werden oder wenn das Objekt explizit zerstört wird, oder in beliebiger Reihenfolge am Ende des Skripts.
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Eine Exception im Destruktor führt nicht zwangsweise zu einem Fatal Error, das ist nur der Fall wenn sie nicht auch gleich im Destruktor wieder gefangen wird.

          Das eigentliche Problem liegt darin, dass der Code nach der Objektinitialisierung noch ausgeführt wird obwohl ja nen Fatal Error auftritt. Aber ist ja eigentlich auch ganz klar, denn der Fatal Error tritt im Destruktor der Klasse auf, welcher wiederum erst am Ende des Skriptes ausgeführt wird. Das bedeutet, dass alles was zwischen Objektinitialisierung und Skriptende steht auch ausgeführt wird, obwohl von Anfang an klar ist, dass es auf einen Fatal Error hinauslaufen wird.

          Kommentar


          • #6
            Zitat von peaceman Beitrag anzeigen
            Das eigentliche Problem liegt darin, dass der Code nach der Objektinitialisierung noch ausgeführt wird obwohl ja nen Fatal Error auftritt. Aber ist ja eigentlich auch ganz klar, denn der Fatal Error tritt im Destruktor der Klasse auf, welcher wiederum erst am Ende des Skriptes ausgeführt wird.
            Ich verstehe nicht ganz, worauf du hinaus willst.

            Damit überhaupt ein fatal error auftreten kann, MUSS Code ausgeführt werden. Exceptions sind Laufzeitfehler... Ausnahmen von der Regel. Code, der nicht ausgeführt wird, kann auch keine Ausnahme erzeugen.

            Zitat von peaceman Beitrag anzeigen
            Das bedeutet, dass alles was zwischen Objektinitialisierung und Skriptende steht auch ausgeführt wird, obwohl von Anfang an klar ist, dass es auf einen Fatal Error hinauslaufen wird.
            Wieso ist es von Anfang an klar, das es auf einen Fehler hinausläuft?
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Naja PHP parsed den Code ja erstmal und müsste dann sehen, aha hier wird in einem Destruktor eine Exception geworfen, das bedeutet dass sie noch innerhalb des Destruktors gefangen werden muss, was bei Exceptions die nicht im Destruktor geworfen werden ja nicht der Fall ist, denn diese werden ja durch den Stack gereicht bis sich jemand findet der einen passenden Catch Block hat und wenn keiner gefunden wird, wird der Fatal Error "Uncaught Exception" ausgelöst.

              Kommentar


              • #8
                Zitat von peaceman Beitrag anzeigen
                Naja PHP parsed den Code ja erstmal und müsste dann sehen, aha hier wird in einem Destruktor eine Exception geworfen, das bedeutet dass sie noch innerhalb des Destruktors gefangen werden muss.
                Eben das tut er nicht. Das macht auch keine andere Programmiersprache, denn der GRUND für die Exception ist dynamisch (in deinem Fall wird eine Exception nur ausgelöst, wenn im Destruktor die member Variable $a einen Wert ungleich 0 hat - das ist aber eine Eigenschaft, die erst zur Laufzeit feststeht und auch von Objektinstanz zu Objektinstanz unterschiedlich sein kann. Der Parser könnte da gar nicht grundsätzlich entscheiden "der Code erzeugt einen Fehler").

                Der Parser untersucht den Code auf syntaktische Korrektheit, aber er interpretiert ihn nicht (jedenfalls nicht zu dieser Zeit).
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Könnte man aber als Syntaxfehler werten, denn es besteht die Möglichkeit, dass die Exception geworfen wird. Das hätte ich im letzten Post anders formulieren sollen.

                  Kommentar


                  • #10
                    Eine Exception im Destruktor führt nicht zwangsläufig zu einem Fatal-Error:
                    PHP-Code:
                    class Test
                    {
                        public function 
                    __destruct()
                        {
                            throw new 
                    Exception(__METHOD__);
                        }
                    }


                    try
                    {
                        
                    $Test = new Test();
                        
                    $Test null;
                    }
                    catch(
                    Exception $E)
                    {
                        echo 
                    $E->getMessage();

                    Code:
                    Test::__destruct

                    Kommentar


                    • #11
                      Ok, stimmt auch wieder. An die manuelle Löschung des Objektes hatte ich überhaupt nicht gedacht.

                      Kommentar


                      • #12
                        Zitat von hpf Beitrag anzeigen
                        Eine Exception im Destruktor führt nicht zwangsläufig zu einem Fatal-Error:
                        PHP-Code:
                        class Test
                        {
                            public function 
                        __destruct()
                            {
                                throw new 
                        Exception(__METHOD__);
                            }
                        }


                        try
                        {
                            
                        $Test = new Test();
                            
                        $Test null;
                        }
                        catch(
                        Exception $E)
                        {
                            echo 
                        $E->getMessage();

                        Code:
                        Test::__destruct
                        Die Exception wird ja auch abgefangen (und damit behandelt) BEVOR das Script in die Beendigungsphase des Scriptes eintritt (lies: dein Destruktor wird beim expliziten Löschen des Objekts aufgerufen, siehe unten).
                        Vermutlich haben die Schreiber der Doku das gemeint mit dem Nebensatz in Klammern:
                        Hinweis: Der Versucht eine Exception aus einem Destruktor (der in der Beendigungsphase des Skripts aufgerufen wurde) heraus zu werfen wird einen fatalen Fehler auslösen.
                        Passend zur Erklärung, wann ein Destruktor ausgeführt wird:
                        Die Destruktormethode wird aufgerufen, sobald alle Referenzen auf ein bestimmtes Objekt entfernt werden oder wenn das Objekt explizit zerstört wird, oder in beliebiger Reihenfolge am Ende des Skripts.
                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #13
                          Zitat von lstegelitz Beitrag anzeigen
                          Die Exception wird ja auch abgefangen (und damit behandelt) BEVOR das Script in die Beendigungsphase des Scriptes eintritt (lies: dein Destruktor wird beim expliziten Löschen des Objekts aufgerufen, siehe unten).
                          Ja, das ist richtig. Von dir kam aber die Aussage:
                          Eine Exception im Destruktor führt immer zu einem fatal error
                          woraufhin peaceman die generelle Sinnhaftigkeit einer Exception in Frage gestellt hat.

                          Das wollte ich einfach nur richtig stellen.

                          Kommentar


                          • #14
                            Ok, hast recht, mein Fehler.. hab die Aussage aus dem Manual nochmal verallgemeinert, das war nicht korrekt
                            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                            Kommentar


                            • #15
                              Moment, wo hab ich genau die generelle Sinnhaftigkeit einer Exception in Frage gestellt?

                              Kommentar

                              Lädt...
                              X