getTrace() auswerten

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

  • getTrace() auswerten

    Ich habe ein kleines Skript geschrieben, dass das von einer Exception zurückgegebene Trace auswertet und in einer sinnvollen Art und Weise ausgibt, d.h. zuoberst im Trace-Array soll der Kontext stehen, also die Calling Scope, oder wie man nennt, dort wo es halt "nicht mehr weiter geht", und zu tiefst soll der Ort sein, wo die Exception effektiv geworfen wurde.

    Beispiel:
    PHP-Code:
    class Tester{
        public function 
    __construct(){
            throw new 
    Exc('in einer Klasse im Index geworfen'); // Linie 205
        
    }
    }
    try{
        
    $test = new Tester();

    } catch (
    Exception $exc){
        
    Error::generate()->catchException($exc);  // Linie 220 
        

    Als Resultat meines Skript erhält man ein Array, das bis jetzt so aussieht:
    Die ersten zwei Elemente sind selbsterklärend, das Level ist so was wie der Code der Exception. Jetzt kommt der Punkt:

    Im Array 'context' befindet sich der übergeordnete Kontext- also die Zeile in der index.php, wo ein Objekt der Klasse 'Tester' erzeugt wurde.

    Im Array 'trace' folgt dann der eigentliche Backtrace wiederum in Form von einzelnen Arrays.. In diesem Beispiel ist es jetzt nur ein Array.


    Code:
    array(5) {
      ["exc"]=>
      string(3) "Exc"
      ["msg"]=>
      string(33) "in einer Klasse im Index geworfen"
      ["level"]=>
      int(1024)
      ["context"]=>
      array(6) {
        ["file"]=>
        string(26) "\metadatamanager\index.php"
        ["line"]=>
        int(220)
        ["function"]=>
        string(11) "__construct"
        ["class"]=>
        string(6) "Tester"
        ["type"]=>
        string(2) "->"
        ["args"]=>
        array(0) {
        }
      }
      ["trace"]=>
      array(1) {
        [1]=>
        array(6) {
          ["file"]=>
          string(26) "\metadatamanager\index.php"
          ["line"]=>
          int(205)
          ["function"]=>
          NULL
          ["class"]=>
          NULL
          ["type"]=>
          NULL
          ["args"]=>
          NULL
        }
      }
    }
    So weit, so gut, funktioniert alles nach meinem Gusto. Was ich jetzt noch möchte, und hier stellt mir meine jämmerliche Übung mit Arrays und Schleifen i.A. ein Bein: Ich möchte, dass 'function', 'class' und 'type' jeweils ein Array "runterrutschen", d.h. dass in diesem Fall beim 'context' alle drei Elemente NULL sind und dafür bei ['trace']['1'] eingefügt werden- weil ja die Exception IN der Methode Tester->__construct() geworfen worden sind- ich möchte also eigentlich für jeden Backtrace die beinhaltende Methode anzeigen, und nicht die Methode, die die nächst untere Ebene aufgerufen hat. Ich hoffe, ich habe mich verständlich ausgedrückt.
    Kann mir jemand eine einigermassen elegante Lösung aufzeigen oder wenigstens Anhaltspunkte geben? Schon für diese Aufarbeitung habe ich ca. 70 Zeilen Code gebraucht, was nicht gerade zeigt, dass ich gut programmieren kann... ;-)

  • #2
    Darf man fragen wieso du den Stacktrace so umformatieren willst? Die Ausgabe von PHP ist doch in Ordnung oder nicht?

    Kommentar


    • #3
      In Ordnung ist sie schon, aber nicht gerade benutzerfreundlich. Erstens gehts mir darum, die Lesbarkeit zu erhöhen und die Meldungen ansprechend zu formatieren, und zweitens finde ich die Anordnung des Stacktraces nicht gerade intuitiv nachvollziehbar - deshalb habe ich ja die Reihenfolge geändert. Als Entwickler will ich doch zuerst einmal sehen, wo im Calling Scope ein Fehler auftrat, und wenns mich weiter interessiert, kann ich dann den Backtrace schrittweise durchlaufen, bis ich an der Stelle bin, wo die Exception effektiv geworfen wird. Wenn mir mit $exc->getLine() und $exc->getFile() dieser Ort standardmässig angezeigt wird, bringt mir das nicht viel, denn ich weiss ja nicht, in welchem Kontext die Funktion/Methode, die die Exception geworfen hat, aufgerufen worden ist.

      Kommentar

      Lädt...
      X