2010-08-15 5 views
26

En JavaScript J'ai un var str = ".a long string that contains many lines..." En cas d'exception qui a causé par eval(str);Javascript eval() Exception - numéro de ligne

J'ai eu comme de l'attraper et imprimer le numéro de la ligne qui a provoqué l'exception. (la ligne interne à str ..)

Est-ce possible?

EDIT Dans le cadre du projet Alligator (http://github.com/mrohad/Alligator), un serveur d'applications pour JavaScript, je lis des fichiers à partir du disque et tout eval() qui est imbriqué à un scriplet (<?>)

Je cours ce script en dehors d'un navigateur, en utilisant NodeJS (au-dessus de la V8).

+2

Je ne sais pas ce peut être fait du tout sans séparer la commande multi-ligne en instructions séparées et en appels eval(). –

+2

Il est assez moche d'utiliser "eval" en premier lieu. Peut-être pourriez-vous décrire ce que vous essayez de faire, et quelqu'un pourrait avoir une meilleure idée. – Pointy

+1

Le problème avec la division de l'eval en lignes multiples est par exemple quand vous avez si (cond) <- ligne # 1 {un certain code} <- ligne # 2, ligne 1 lancera une exception car elle dépend de la ligne # 2 – DuduAlul

Répondre

3

J'ai trouvé une solution qui est assez inefficace, mais Je ne l'utilise que lorsque debug_mode == 1 donc ce n'est pas si mauvais ..

J'écris l'eval_str dans un fichier, je "importe ce fichier, un d invoquer l'intérieur d'un try {} catch {} et je parse la ligne d'erreur de la trace de la pile ...

Dans mon cas particulier, voici comment le code ressemble à:

var errFileContent = "exports.run = "+evalStringAsAFunction+";"; 
fs.writeFile('/home/vadmin/Alligator/lib/debugging.js', errFileContent, function (err) { 
    var debug = require('./debugging'); 
    try{ 
     debug.run(args...); 
    } 
    catch(er){ 
     log.debug(parseg(er)); 
    } 
}); 
+1

Ceci est un hack inefficace, mais c'est définitivement une solution de contournement jusqu'à ce que Google V8 prend en charge cette fonctionnalité. Nice, merci. – BMiner

+0

Malheureusement, cela ne fonctionnera pas dans le navigateur ... – Domi

0

Cela résout votre problème?

try { 
    eval(str); 
} catch (e) { 
    console.log(e.lineNumber) 
} 
+1

Je ne suis pas défini pour e.lineNumber ... – DuduAlul

+2

@MrOhad, la propriété 'lineNumber' sur les objets Error est * non-standard *, il ne fonctionnera que sur les implémentations de Mozilla, mais je crains qu'il ne vous renvoie le numéro de ligne où vous avez appelé 'eval', pas le numéro de ligne dans le texte évalué. – CMS

+1

Fonctionne dans Firefox, mais pas dans les autres navigateurs. Dans Chrome/Iron, vous pouvez obtenir le numéro de ligne proche de la fin de 'e.stack'. –

3

1) Run:

 
var javascript_offset; 
try { 
    undefined_function(); 
} catch(ex1) { 
    javascript_offset = ex1.lineNumber; 
} 
try { 
    YOUR_STRING_WITH_JS 
} catch (ex2) { 
    var line_that_caused_it = ex2.lineNumber - javascript_offset -2; 
    HANDLE_THE_EXCEPTION_HERE 
} 
+0

Je cours ce script en dehors d'un navigateur, en utilisant NodeJS (sur V8) – DuduAlul

6

Essayez d'ajouter try/catch à la chaîne au lieu d'autour du eval:

var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}'; 
+0

Je pensais que c'est encore mieux que ma solution, mais je l'ai testé et ça ne marche pas, même pile que si le try {} catch { } ne faisait pas partie de l'eval – DuduAlul

+0

combinez cela avec la solution de @AndreyKo et vous avez une solution qui fonctionnera dans Firefox – Michael

+0

Ceci est une solution BEAU, merci Steve – sleepycal