MB: Wofür dient $throw->getPrevious() im Handling? Wozu brauch man ellenlangen Backtrace im einfachen Error

moin,

und guten abend.

  1. Wozu ist $throwable->getPrevious() da??? Welche informationen bietet es um gezioelter zu debuggen

  2. Mir erschließst sich die Sinnhaftigkeit beim $trace an einem gefangenem einfachen Error nicht.

0 / 0;
array(5) {
  ["_GET"]=>
  array(0) {
  }
  ["_POST"]=>
  array(0) {
  }
  ["_COOKIE"]=>
  array(1) {
    ["PHPSESSID"]=>
    string(26) "#HASH#"
  }
  ["_FILES"]=>
  array(0) {
  }
  ["_SERVER"]=>
  array(42) {
    ...
  }
}

lgmb

  1. Hallo MB,

    dein Ausgabe-Beispiel passt für mich nicht zu getPrevious. Darum verstehe ich Deine Frage vielleicht falsch.

    Grundsätzlich besteht immer die Möglichkeit, dass mal als Reaktion auf eine Exception vom Typ A eine neue Exception vom Typ B werfen möchte. Es ist dann für den Handler der neuen Exception ggf. sinnvoll, wenn er weiß, was die Exception B ausgelöst hat. Dafür dient getPrevious. Es lässt dich auf diese "innere Exception" zugreifen.

    Das PHP Handbuch demonstriert das eigentlich ganz gut:

    https://www.php.net/manual/de/exception.getprevious.php

    Rolf

    --
    sumpsi - posui - clusi
    1. moin,

      dein Ausgabe-Beispiel passt für mich nicht zu getPrevious. Darum verstehe ich Deine Frage vielleicht falsch.

      Ich habe zwei unterschiedliche Frage gestellt die den zselben sachzusammenhang haben. Die Frage mit Anschauungs-Beispiel unter Punkt 2. hat nichts mit Punkt 1. zutun, wenn ich deine Frage richtig verstehe versteht sich 😉.

      Grundsätzlich besteht immer die Möglichkeit, [...]

      kannst du ein Anschauungs-Beispiel zu Punkt 1. machen wenns geht natürlich. Ich hab diese Docu und andere durchgelesen aber ich verstehe es nicht 😟.

      Zu Punkt 2.: Ich wolte eigentlich ein backtrace zum Einfachen Error machen, sowas wie hier in der meiner gecatchted dummy Exception…

      …jedoch gibt der mir nur Superglobale Variablen aus 😕 oder sind das sozusagen diese Backtrace???

      lgmb

      1. Tach!

        dein Ausgabe-Beispiel passt für mich nicht zu getPrevious. Darum verstehe ich Deine Frage vielleicht falsch.

        Ich habe zwei unterschiedliche Frage gestellt die den zselben sachzusammenhang haben. Die Frage mit Anschauungs-Beispiel unter Punkt 2. hat nichts mit Punkt 1. zutun, wenn ich deine Frage richtig verstehe versteht sich 😉.

        Ja, aber der Dump passt weder zur ersten noch zur zweiten Frage.

        Grundsätzlich besteht immer die Möglichkeit, [...]

        kannst du ein Anschauungs-Beispiel zu Punkt 1. machen wenns geht natürlich. Ich hab diese Docu und andere durchgelesen aber ich verstehe es nicht 😟.

        Eine Datenbank-Funktion einer konkreten Datenbank-API wirft einen Fehler. Eine Datenbankabstraktion, die für viele Datenbanken vorgesehen ist, fängt diesen Fehler, kann damit aber auch nichts anfangen und wirft ihn weiter. Allerdings möchte der Entwickler der Abstraktion hier, dass alle Exceptions von einer von ihm definierten Klasse sind, damit man sie weiter oben besser anhand der Klasse fangen kann, und das unabhängig vom konkreten Datenbank-API. Das eigentliche Original kommt in das Feld für die Previous-Exception der von ihm geworfenen Exception. Diese kann entweder allgemein gehalten sein - wenn er für den konkreten Fehler nicht speziell vorgesehen hat - oder spezifischer.

        Zu Punkt 2.: Ich wolte eigentlich ein backtrace zum Einfachen Error machen, sowas wie hier in der meiner gecatchted dummy Exception…

        …jedoch gibt der mir nur Superglobale Variablen aus 😕 oder sind das sozusagen diese Backtrace???

        Wer ist "der"? Vielleicht derjenige, der was anderes in der Zwischenablage hatte?

        Den Backtrace jedenfalls braucht man zum Rückverfolgen des Ablaufs. Die Frage, die er beantwortet ist: Was genau hat zur Situation geführt, in der die Exception geworfen wurde? Vielleicht wurde die Funktion - oder auch irgendeine andere vorher - mit unerwarteten Parametern aufgerufen, dann kannst du das in dem Backtrace sehen. Er ist sozusagen das, was du bei einem Live-Debugger im Call-Stack sehen kannst.

        dedlfix.

        1. moin,

          Tach!

          dein Ausgabe-Beispiel passt für mich nicht zu getPrevious. Darum verstehe ich Deine Frage vielleicht falsch.

          Ich habe zwei unterschiedliche Frage gestellt […]

          Ja, aber der Dump passt weder zur ersten noch zur zweiten Frage.

          Sry, checke ich nicht. Welcher Dump? Meinst du in der Eingangsfrage diese Arrays mit 0 / 0; induziert?

          Grundsätzlich besteht immer die Möglichkeit, [...]

          kannst du ein Anschauungs-Beispiel zu Punkt 1. machen […]

          Eine Datenbank-Funktion einer konkreten Datenbank-API wirft einen Fehler. […]

          Bedankt, verstanden.

          …jedoch gibt der mir nur Superglobale Variablen aus 😕 oder sind das sozusagen diese Backtrace???

          Wer ist "der"? Vielleicht derjenige, der was anderes in der Zwischenablage hatte?

          0/0; induzierter Error.

          Den Backtrace jedenfalls braucht man zum Rückverfolgen des Ablaufs. […]

          Ist mir schon Bewusst. Danke für deine Ausführung. Ich hab die Tabelle im Image ja selbst geschrieben mit dem Backtrace von "1". Ich wollte nur die Tok Klasse per Construktor-Injection mit der Foobar Klasse einen Error erzeugen und den vorbildhaft von der Debugger Klasse gefangen und dann über HTML-Konstruktoren und Factories übergeben und in einr Tabelle angezeigt, fertig.

          lgmb

          1. Tach!

            dein Ausgabe-Beispiel passt für mich nicht zu getPrevious. Darum verstehe ich Deine Frage vielleicht falsch.

            Ich habe zwei unterschiedliche Frage gestellt […]

            Ja, aber der Dump passt weder zur ersten noch zur zweiten Frage.

            Sry, checke ich nicht. Welcher Dump? Meinst du in der Eingangsfrage diese Arrays mit 0 / 0; induziert?

            In deinem Ausgangsposting zeigst du einen Dump von - so sieht es aus - $GLOBALS. Das hat nur dann und auch nur teilweise mit einem Backtrace zu tun, wenn jemand $GLOBALS als Argument übergeben hat. In dem Fall ist das aber nur ein Ausschnitt aus dem Backtrace. Diese Ausgabe kann man auch mit einem var_dump($_GLOBALS) erzeugen. Abgesehen von dem 0 / 0; - wo auch immer das herkommt.

            Grundsätzlich besteht immer die Möglichkeit, [...]

            kannst du ein Anschauungs-Beispiel zu Punkt 1. machen […]

            Eine Datenbank-Funktion einer konkreten Datenbank-API wirft einen Fehler. […]

            Bedankt, verstanden.

            …jedoch gibt der mir nur Superglobale Variablen aus 😕 oder sind das sozusagen diese Backtrace???

            Wer ist "der"? Vielleicht derjenige, der was anderes in der Zwischenablage hatte?

            0/0; induzierter Error.

            Mach es nachvollziehbar. Zeig den (Minimal-)Code, der zu einer solchen Ausgabe führt, inklusive Angabe, ob und welche Debugger-Extensions im PHP laufen.

            dedlfix.

            1. moin,

              In deinem Ausgangsposting zeigst du einen Dump von - so sieht es aus - $GLOBALS. Das hat nur dann und auch nur teilweise mit einem Backtrace zu tun, wenn jemand $GLOBALS als Argument übergeben hat. In dem Fall ist das aber nur ein Ausschnitt aus dem Backtrace. Diese Ausgabe kann man auch mit einem var_dump($_GLOBALS) erzeugen. Abgesehen von dem 0 / 0; - wo auch immer das herkommt.

              Ahhh. Ok Danke. Jetzt wird mir einiges klar.

              0/0; induzierter Error.

              Mach es nachvollziehbar. Zeig den (Minimal-)Code, der zu einer solchen Ausgabe führt, inklusive Angabe, ob und welche Debugger-Extensions im PHP laufen.

              Mir ist jetzt einiges klarer geworden. IDE ist grade verhindert. Es ist ein sehr trivialer Code der zu diesem Error fürt. Ich stelle ihn euch in diesem Thead heute abend vor.

              lgmb

            2. moin,

              0/0; induzierter Error.

              Mach es nachvollziehbar. […]

              Zum Code der den gewollten Fehler produziert.

              <?php
                
                // Error Handler
                set_error_handler( function( $code, $message, $file, $line, $trace ) {
                  echo '<pre>';
                  var_dump( [ $code, $message, $file, $line, $trace ] );
                } );
                
                // Error
                0/0;
              
              ?>
              

              Bei nicht klassen basiertem Errors ist der $trace wenig aussagekräftig weil er hier nur die Globalen Variablen Zeigt mehr nicht:

              array(5) {
                [0]=>
                int(2)
                [1]=>
                string(16) "Division by zero"
                [2]=>
                string(36) "E:\ide\xampp\htdocs\public\index.php"
                [3]=>
                int(9)
                [4]=>
                array(4) {
                  ["_GET"]=>
                  array(0) {
                  }
                  ["_POST"]=>
                  array(0) {
                  }
                  ["_COOKIE"]=>
                  array(0) {
                  }
                  ["_FILES"]=>
                  array(0) {
                  }
                }
              }
              

              Ich hab vermutet das diese Superglobalen Variablen gerade der Backtrace ist.

              lgmb

              1. Nachtrag: Superglobalen Variablen "mit" oder "ohne" Inhalt.

              2. Hallo MB,

                woher hast Du deinen Code kopiert? Denn mit Handbuchlesen und selberschreiben wäre Dir das vermutlich nicht passiert.

                https://www.php.net/manual/de/function.set-error-handler.php

                errcontext
                Der fünfte Parameter errcontext ist optional. Es handelt sich um ein Array, das auf die Stelle der aktiven Symboltabelle zeigt, die den Fehler verursacht hat. Mit anderen Worten: errcontext enthält ein Array mit allen Variablen, die im fehlerauslösenden Bereich existierten. Die benutzerdefinierte Fehlerbehandlung darf den Fehlerkontext nicht verändern.

                Wenn Du also den Fehlerkontext $trace nennst, dient das zwar optimal zur Verwirrung der Russen - äh, heutzutage wohl eher Chinesen - aber es nützt weder Dir noch uns wirklich.

                Die Lösung ist demnach: es gab bei Dir im fraglichen Moment keine anderen sichtbaren Variablen als die Superglobals.

                Ich habe das unter Windows auch mal laufen lassen, als Kommandozeilen-Script, da sieht das Ergebnis so aus (ein paar Zeilenbrüche und etliche Einträge von $_SERVER habe ich gelöscht). Aber das ist vermutlich von php.ini zu php.ini und von Betriebssystem zu Betriebssystem verschieden.

                array(5) {
                  [0]=>
                  int(2)
                  [1]=>
                  string(16) "Division by zero"
                  [2]=>
                  string(24) "***\divzero.php"
                  [3]=>
                  int(10)
                  [4]=>
                  array(8) {
                    ["_GET"]=>array(0) {    }
                    ["_POST"]=>array(0) {    }
                    ["_COOKIE"]=>array(0) {    }
                    ["_FILES"]=>array(0) {   }
                    ["argv"]=>array(1) {      
                       [0]=>string(24) "***\divzero.php"
                    }
                    ["argc"]=>int(1)
                    ["_SESSION"]=>&array(0) {    }
                    ["_SERVER"]=>array(60) {
                      ["ALLUSERSPROFILE"]=>string(14) "C:\ProgramData"
                      ...
                      ["REQUEST_TIME"]=>int(1569258873)
                      ["argv"]=>array(1) {
                         [0]=>string(24) "***\divzero.php"
                      }
                      ["argc"]=>int(1)
                    }
                  }
                }
                

                Rolf

                --
                sumpsi - posui - clusi
                1. moin,

                  woher hast Du deinen Code kopiert? Denn mit Handbuchlesen und selberschreiben wäre Dir das vermutlich nicht passiert.

                  Na selbst geschrieben natürlich, sowohl den anschaulichen Debugger + Umgebungsklassen also auch das eingehackte Code Beispiel.

                  https://www.php.net/manual/de/function.set-error-handler.php

                  DAS habe ich echt überlesen 😟. Danke

                  Die Lösung ist demnach: es gab bei Dir im fraglichen Moment keine anderen sichtbaren Variablen als die Superglobals.

                  Das erschließt sich mir. Vielen herzlichen Dank. Jetzt kann ich ruhig schlafen - und die Russen bzw. die Chinesen auch 😂.

                  lgmb

      2. Hallo MB,

        es fällt mir schwer, dir weiter zu helfen. Ich weiß nicht, wo dein Verständnisproblem ist.

        Bei den Errors/Exceptions ist es einfach so, dass man gelegentlich im catch eine neue Exception werfen möchte. Zum Beispiel, weil es 7 Möglichkeiten gibt wie in einer Funktion ein Fehler passiert, und du das für den Nutzer der Funktion mit einer einheitlichen Exception darstellen willst. Dieser neuen Exception hängst du die alte an, wie im Handbuch gezeigt, um im Fehlertrace die Ursache ausgeben zu können.

        Dein $trace Problem verstehe ich nicht. Was ist $trace? Wovon ist der Screenshot?

        Rolf

        --
        sumpsi - posui - clusi
        1. moin,

          es fällt mir schwer, dir weiter zu helfen. Ich weiß nicht, wo dein Verständnisproblem ist.

          alles ok. Ich muss gláube ich mich sehr intensiv damit beschäftigen. Anzäze habe ich ja durch euch erklärt bekommen.

          Dein $trace Problem verstehe ich nicht. Was ist $trace? Wovon ist der Screenshot?

          siehe meine AW zu @dedlfix

          lgmb

        2. moin,

          Dein $trace Problem verstehe ich nicht. Was ist $trace? Wovon ist der

          siehe meine AW zu @dedlfix

          lgmb