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:
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.
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... ;-)
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
}
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 } } }
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... ;-)
Kommentar