2010-08-15 27 views
26

En JavaScript Tengo un caso de excepción var str = ".a long string that contains many lines..." En la causada por eval(str);Javascript eval() Excepción - número de línea

tuve como para cogerlo e imprimir el número de la línea que causó la excepción. (la línea interna a str ..)

¿Es posible?

EDITAR Como parte del proyecto de cocodrilo (http://github.com/mrohad/Alligator), un servidor de aplicaciones para JavaScript, estoy leyendo los archivos del disco y eval() cualquier cosa que está anidado a un scriplet (<?>)

Estoy ejecutando este script fuera de un navegador, usando NodeJS (en la parte superior de V8).

+2

No estoy seguro que se puede hacer sin dividir el comando multilínea en instrucciones separadas y llamadas eval(). –

+2

En primer lugar, es bastante feo usar "eval". Tal vez podrías describir lo que estás tratando de hacer, y alguien podría tener una mejor idea. – Pointy

+1

El problema con dividir el eval en líneas múltiples es por ejemplo cuando tienes if (cond) <- línea # 1 {algún código} <- línea # 2, línea 1 arrojará excepción ya que depende de la línea # 2 – DuduAlul

Respuesta

3

he encontrado una solución que es bastante ineficiente, sin embargo, Solo lo uso cuando debug_mode == 1 por lo que no es tan malo ...

Escribo el eval_str en un archivo, "importo ese archivo, d invocar dentro de un try {} catch {} y analizar la línea de error del seguimiento de la pila ...

En mi caso concreto, se trata de cómo el código es el siguiente:

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

Esto es un truco ineficiente, pero definitivamente es una solución hasta que Google V8 admita esta característica. Bien, gracias. – BMiner

+0

Lamentablemente, esto no funcionará en el navegador ... – Domi

0

Esto soluciona su problema?

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

Me estoy volviendo indefinido para e.lineNumber ... – DuduAlul

+2

@MrOhad, la propiedad 'lineNumber' en Error objects is * no estándar *, funcionará solo en las implementaciones de Mozilla, pero me temo que devolverá el número de línea donde invocó 'eval', no el número de línea real dentro del texto evaluado. – CMS

+1

Funciona en Firefox, pero no en otros navegadores. En Chrome/Iron, puede obtener el número de fila cerca del final de 'e.stack'. –

3

1) Ejecutar:

 
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

Estoy ejecutando este script fuera de un navegador, usando NodeJS (en la parte superior de V8) – DuduAlul

6

Trate de añadir el try/catch para la cadena en lugar de alrededor de la eval:

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

Pensé que es incluso mejor que mi solución, pero lo he probado y no funciona, la misma pila que si try {} captura { } no fue parte de eval – DuduAlul

+0

combinar esto con la solución de @AndreyKo y tiene una solución que funcionará en Firefox – Michael

+0

Esta es una solución HERMOSA, gracias Steve – sleepycal

Cuestiones relacionadas