Hi!
eval("var p=" + str + ";");
Das Problem taucht vermutlich auf, wenn der eval() fehl schlägt, weil im String keine richtigen Daten sind.
Wie wäre es, stattdessen richtige Daten in den String zu bringen, also solche, die den Syntaxregeln von Javascript entsprechen? Alles andere ist Murksen an der falschen Baustelle.
Ich habe es schon versucht. Trotzdem kommt es manchmal dazu z.B. wenn PHP wegen eines Fatalen Fehlers abgebrochen wird. Deshalb wollte ich die Funktion tolerant ausführen.
Dann solltest du, wie ich schon vorschlug, die Ausgabe der Fehlermeldungen unterdrücken. Sie haben auf einem Produktivsystem sowieso nichts in der normalen Ausgabe zu suchen. Die Besucher können und sollen mit diesen Informationen nichts anfangen. Es sollte sowieso nur Laufzeitfehler auftreten, denn syntaktische hat man üblicherweise durch umfangreichen Tests ausgeschlossen. Die Ausgabe von Laufzeitfehlern lässt sich komplett unterdrücken (display_errors=off) - unabhängig davon, kann und sollte man sie ja loggen.
Wenn eval() keine korrekte Syntax findet, kann es diese nicht ausführen. Also ist auch das erwartete Ergebnis nicht da, in diesem Fall eine angelegte Variable namens p.
Wird eval() dann einfach ignoriert und der Fehler tritt eigentlich nur in der Zeile auf, in der auf p zuzugreifen versucht wird? Oder Hängt sich JavaScript dort tatsächlich an eval() auf? Wenn ersteres, dann kann man das ja abfangen.
Eval kann nicht vorher wissen, dass es scheitern wird. Es wird also aufgerufen werden. Nur wird es nicht das erhoffte Ergebnis bringen. In deinem Fall ist das doch nur eine Variablenzuweisung. Bei einer solchen wird zuerst der zuzuweisende Ausdruck ausgwertet. Erst dann (und wenn das erfolgreich verlief) wird die Variable angelegt beziehungsweise deren Inhalt verändert, wenn sie schon vorher existierte.
Ein Fehler kann aber auch schon vorher auftreten, wenn das Befüllen von str mittels erzeugtem Javascript-Code vorgenommen wird. Also
var str = '{
foo: "bar";
}';
In dem Fall wären Zeilenumbrüche im Code der Stringzuweisung. Das darf in Javascript nicht sein. Wenn allerdings der Inhalt in PHP vorbereitet wird und als Ajax-Response in str landet, dann ist dieser Fall nicht relevant. Bei einem eval() macht sich erst dann ein Problem bemerkbar, wenn aus dessen Sicht ungültige Syntax vorliegt. eval() bekommt ja nur den Inhalt des Strings zu sehen.
var str = '{
foo: "bar
qux";
}';
Hier geht der String "bar qux" über zwei Zeilen und erzeugt einen Syntaxfehler.
Lo!