2010-08-15 7 views
26

In JavaScript Ho un caso di eccezione var str = ".a long string that contains many lines..." In quella causata da eval(str);Javascript eval() Eccezione - numero di riga

ho dovuto piace prenderlo e stampare il numero della riga che ha causato l'eccezione. (La linea interna a str ..)

E 'possibile?

EDIT Come parte del progetto Alligator (http://github.com/mrohad/Alligator), un application server per JavaScript, sto leggendo i file dal disco e eval() tutto ciò che è annidato ad una scriplet (<??>)

Sto eseguendo questo script all'esterno di un browser, utilizzando NodeJS (sopra V8).

+2

Non sono sicuro questo può essere fatto senza dividere il comando multilinea in istruzioni separate e chiamate eval(). –

+2

In primo luogo è molto brutto usare "eval". Forse potresti descrivere quello che stai cercando di fare, e qualcuno potrebbe avere un'idea migliore. – Pointy

+1

Il problema con la divisione del eval per linee Multi è ad esempio quando si dispone di if (cond) <- linea # 1 {codice} <- linea # 2, la linea 1 lancerà un'eccezione in quanto dipende da linea # 2 – DuduAlul

risposta

3

ho trovato una soluzione che è piuttosto inefficiente, ma lo uso solo quando debug_mode == 1 quindi non è poi così male ..

scrivo l'eval_str in un file, I "di importazione che di file, un d richiamare all'interno di un try {} catch {} e analizzare la riga di errore dalla analisi dello stack ...

Nel mio caso specifico, questo è come il codice è simile:

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

Questo è un hack inefficiente, ma è sicuramente una soluzione alternativa finché Google V8 non supporta questa funzionalità. Bello, grazie. – BMiner

+0

Purtroppo questo non funzionerà nel browser ... – Domi

0

Questo risolve il problema?

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

mi sto indefinito per e.lineNumber ... – DuduAlul

+2

@MrOhad, la proprietà 'lineNumber' su oggetti di errore è * non standard *, funzionerà solo su implementazioni di Mozilla, ma temo che ti restituisca il numero di riga in cui hai richiamato 'eval', non il numero di riga effettivo all'interno del testo valutato. – CMS

+1

Funziona con Firefox, ma non con altri browser. In Chrome/Iron, puoi ottenere il numero di riga vicino alla fine di '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

Sto eseguendo questo script all'esterno di un browser, utilizzando NodeJS (sopra V8) – DuduAlul

6

Prova ad aggiungere il try/catch per la stringa invece che intorno alla eval:

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

Ho pensato che sia persino migliore della mia soluzione, ma l'ho provato e non funziona, lo stesso stack come se il try {} catch { } non faceva parte della eval – DuduAlul

+0

combina questo con la soluzione di @AndreyKo e hai una soluzione che funzionerà in Firefox – Michael

+0

Questa è una soluzione BELLISSIMA, grazie Steve – sleepycal