2013-09-04 20 views
15

Per collegare una sezione di commento lunga su "non utilizzare la nuova funzione" e/o "eval è cattiva", questa domanda riguarda come accedere, se possibile, informazioni di errore correlate a un costruttore new Function() in errore. È soprattutto una questione per scoprire un limite a ciò che il browser mi consentirà di fare quando cerco di sfruttare JavaScript nella misura in cui le specifiche e le implementazioni standard del browser lo consentono. Quindi con la dichiarazione di non responsabilità in vigore:Trova dove si verifica un errore di sintassi quando la nuova funzione() non riesce

Quando si valuta il codice tramite una nuova chiamata Function(), esiste un modo per scoprire dove si verifica un errore di sintassi nel contenuto della funzione, se viene valutato il codice di sintassi non valido? cioè .:

try { 
    var generator = new Function(input); 
    try { 
    generator(); 
    } 
    catch (runtimeError) { 
    console.error("legal code; unforeseen result: ", runtimeError); 
    } 
} 
catch (syntaxError) { 
    console.error("illegal code; syntax errors: ", syntaxError); 
} 

Quando l'edificio del generatore non riesce, c'è un modo per scoprire (dal browser, non usando JSLint o un'altra libreria esterna) che cosa l'errore è stato o dove si è verificato?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype menziona che uno SyntaxError ha una proprietà filename e linenumber, ma questi sono indefinito in codice dinamico valutata attraverso una nuova funzione() costruttore da quello che posso dire, così facendo leva sulla oggetto errore stesso sembra non essere un'opzione . Esistono modi alternativi per introdurre il codice nel browser in modo che il codice, una volta che sappiamo che ha errori di sintassi da una nuova chiamata di funzione in errore, può essere utilizzato per scoprire dove si trova il problema in base al motore JS utilizzato?

(Naturalmente, se l'obiettivo era trovare gli errori di sintassi, jslint come una fase di pre-elaborazione sarebbe la soluzione ideale, ma sono più interessato a sapere se i browser possono o meno essere in grado di segnalare questa informazione, anche se in forma limitata come "c'è un errore in linea/char ...")

risposta

4

afaik impossibile scoprire dove si è verificato. ma potresti voler vedere Exception.message per recuperare informazioni sull'errore.

esempio: http://jsbin.com/IRoDiJIV/1/watch?js

+0

ho trovato una soluzione, ma non avevo considerato errori cattura nella gestione del codice, che è un'aggiunta utile. –

+0

Questo esempio è un'eccezione di runtime (in particolare, un ReferenceError), non un SyntaxError! A proposito, il tuo esempio registra effettivamente dove si è verificato l'errore: "Errore lanciato alla riga 1, colonna 0 in (): callundefinedFunction(); chiamato dalla riga 18, colonna 4 in () in http://run.jsbin.com/runner: generator(); chiamato dalla riga 11, colonna 7 in http://run.jsbin.com/runner: (function() {' – Bergi

+0

ha fatto? quale proprietà/metodo hai usato sull'errore? non ho trovato nessuna informazione nel docu o nell'esempio (eseguito in chrome) – floww

1

trovato una soluzione io stesso utilizzando un metodo simiar per setting breakpoints in evaled code

Nel pannello fonti Chrome di strumenti di sviluppo, ho messo il seguente in un punto di interruzione condizionale sulla linea new Function (dal momento che è il codice biblioteca e non posso cambiarlo.)

(function(eval_js, load_js) { 
    try { 
    eval(eval_js); 
    } catch (e) { 
    (function addCode(js) { 
     var e = document.createElement('script'); 
     e.type = 'text/javascript'; 
     e.src = 'data:text/javascript;charset=utf-8,' + escape(js); 
     document.body.appendChild(e); 
     console.warn("Inserted Script for ", js); 
    })(load_js.replace(/;/g,";\n")); 
    handlerCode = ""; 
    return false; 
    } 
    return false; 
})("new Function('event', handlerCode)", handlerCode) 
+0

Come si ottiene il lino di un errore di sintassi in' eval_js' da quello? – Bergi

+0

@Bergi , caricherà il codice handler_js tramite un uri di dati in un nuovo elemento script, che durante l'esecuzione darà un errore nella console che puoi eseguire il debug in chrome dev tools e firebug –

+1

Ma è possibile accedere a quell'errore a livello di codice, senza alcun console di debug? Questo è ciò che l'OP vuole fare. – Bergi

Problemi correlati