2010-08-19 3 views
13

Ich baue etwas, das javascripts on-the-fly asynchron enthält, was funktioniert, aber ich bin auf der Suche nach der Fehlererkennung zu verbessern (so alle Fehler nicht nur erscheinen von einer Linie in der Nähe des AJAX-Aufruf kommen, die sie nach unten zieht.Verfolgen der Quelllinie eines Fehlers in einem Javascript Eval

Wenn ich eval bin mit einem mehrzeiligen JavaScript-Datei zu bewerten, ist es eine Möglichkeit, die verfolgen ein Fehler Linie auf?

tritt

von Wenn ich Referenzen auf die Variablen halte, die ich brauche, wenn ich sie einschließe, habe ich kein Problem festzustellen, in welcher Datei die Fehler auftreten. Mein Problem ist zu bestimmen, welche Zeile der Fehler in auftritt.

Beispiel:

try { 
    eval("var valid_statement = 7; \n invalid_statement())))"); 
} catch(e) { 
    var err = new Error(); 
    err.message = 'Error in Evald Script: ' + e.message; 
    err.lineNumber = ??? 
    throw err; 
} 

Wie kann ich feststellen, dass der Fehler dort in der zweiten Zeile aufgetreten? Speziell interessiert mich das in Firefox.

Ich weiß, dass Fehler Objekte haben e.stack in Mozilla-Browsern, aber die Ausgabe scheint Newlines nicht richtig zu berücksichtigen.

+0

Welche "zweite Zeile" möchten Sie? Sowohl der "eval" als auch der Syntaxfehler in der valuierten Zeichenkette befinden sich in der zweiten Zeile. – matyr

+0

Im Kontext des oben angezeigten Codes, ja. Im Zusammenhang mit dem in der Zeichenfolge eingekapselten Code Ich möchte, dass diese Zeilenumbruch wie in einer Datei analysiert wird, damit ich berichten kann, welche Zeilenfehler in der gelesenen Zeichenfolge auftreten. –

Antwort

6
  • Die Zeilennummer in einem bewerteten Skript beginnt mit der Nummer, die eval ist.
  • Ein Fehlerobjekt hat eine Zeilennummer der Zeile, auf der es erstellt wurde. zuverlässig

So etwas wie ...

try { 
    eval('var valid_statement = 7; \n invalid_statement())))'); 
} catch(e) { 
    var err = e.constructor('Error in Evaled Script: ' + e.message); 
    // +3 because `err` has the line number of the `eval` line plus two. 
    err.lineNumber = e.lineNumber - err.lineNumber + 3; 
    throw err; 
} 
+2

Beachten Sie, dass 'e.lineNumber' eine nicht standardmäßige JavaScript-Funktion ist. – casablanca

+0

"Speziell interessiert mich das in ** Firefox **" – matyr

+0

Perfekt! Das war _exactly_ was ich wollte. Es ist bedauerlich, dass es auf fest codierten Unterschieden zwischen Zeilennummern beruht, aber zumindest funktioniert es. Das Hauptproblem dabei ist, dass es nicht funktioniert, wenn ich einen Minifier für das Skript verwende. Egal, vielen Dank. –

0

Ich glaube nicht, dass Sie es mit eval tun können. Sie können jedoch diese statt eval tun:

try { 
    $("<script />").html(scriptSource).appendTo("head").remove(); 
} catch (e) { 
    alert(e.lineNumber); 
} 
+0

Übersetzung in nicht jquery bitte? – Michael

+0

Wenn Sie nur ein Skript-Tag erstellen und die Quelle dieses Tags für Ihren Code festlegen, funktioniert dies offenbar nicht - Fehler im Skript werden nicht abgefangen. – Michael

1

Vielleicht ist der globale Fehlerereignis-Hörer wird die Ausnahme von eval fangen und zeigt die richtigen Zeilennummern?

window.addEventListener('error', function(e) { 
    console.log(e.message 
     , '\n', e.filename, ':', e.lineno, (e.colno ? ':' + e.colno : '') 
     , e.error && e.error.stack ? '\n' : '', e.error ? e.error.stack : undefined 
    ); 
}, false); 
+1

Ist das eine Frage zu einer Antwort? – heinob

Verwandte Themen