2010-08-19 9 views
13

Je construis quelque chose qui inclut javascripts à la volée de manière asynchrone, ce qui fonctionne, mais je cherche à améliorer la détection d'erreur (donc toutes les erreurs ne sont pas seulement semblent venir d'une ligne près de l'appel AJAX qui les tire vers le bas.Tracer la ligne source d'une erreur dans un eval Javascript

Si j'utilise eval pour évaluer un fichier javascript multiligne, est-il possible de tracer la ligne qui une erreur se produit sur

? Par en gardant des références aux variables dont j'ai besoin pour inclure, je n'ai aucun problème pour déterminer dans quel fichier les erreurs se produisent. Mon problème est de déterminer quelle ligne l'erreur se produit dans.

Exemple:

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; 
} 

Comment puis-je dire que l'erreur est survenue dans la deuxième ligne là-bas? Plus précisément, je suis intéressé à le faire dans Firefox.

Je sais que les objets d'erreur ont e.stack dans les navigateurs Mozilla, mais la sortie ne semble pas prendre correctement en compte les retours à la ligne.

+0

Quelle "deuxième ligne" souhaitez-vous? L'erreur 'eval' et l'erreur de syntaxe dans la chaîne evaled sont toutes les deux sur la deuxième ligne. – matyr

+0

Dans le contexte du code affiché ci-dessus, oui. Dans le contexte du code encapsulé dans la chaîne, non. Je veux que cette nouvelle ligne soit analysée comme elle le serait dans un fichier afin de pouvoir signaler les erreurs de ligne qui se produisent dans la chaîne eval'd. –

Répondre

6
  • Le numéro de ligne dans un script d'évaluation commence à partir de celui sur lequel se trouve le eval.
  • Un objet d'erreur a un numéro de ligne de la ligne sur laquelle il a été créé.

donc quelque chose comme ...

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

Attention, 'e.lineNumber' est une fonctionnalité JavaScript non standard. – casablanca

+0

"Plus précisément, je suis intéressé à le faire dans ** Firefox **" – matyr

+0

Parfait! Cela a exactement ce que je voulais. C'est un peu dommage qu'il repose sur des différences codées en dur entre les numéros de ligne, mais au moins cela fonctionne. Le problème majeur avec cela est que cela ne fonctionnera pas si je cours un minifier sur le script. Peu importe, merci beaucoup. –

0

Je ne pense pas que vous pouvez le faire avec eval fiable. Cependant, vous pouvez le faire au lieu de eval:

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

traduction vers non jquery s'il vous plaît? – Michael

+0

Si vous créez simplement une balise de script et que vous définissez la source de cette balise sur votre code, cela ne fonctionnera apparemment pas - les erreurs dans le script ne sont pas interceptées. – Michael

1

Peut-être que l'erreur globale événement auditeur attraperez l'exception de eval et affiche les numéros de ligne corrects?

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

Est-ce une question sur une réponse? – heinob