2013-09-04 20 views
15

Aby skrócić długą sekcję komentarzy dotyczącą "nie korzystaj z nowej funkcji" i/lub "eval jest złe", to pytanie dotyczy sposobu dostępu, jeśli to możliwe, informacje o błędach związane z niepowodzeniem konstruktora new Function(). Najczęściej chodzi o to, aby odkryć ograniczenia w tym, co przeglądarka pozwoli mi zrobić, próbując wykorzystać JavaScript w stopniu, w jakim pozwalają na to spec i standardowe implementacje przeglądarki. Tak więc z tym zastrzeżeniem w miejscu:Znajdź przyczynę błędu składni, gdy nowa funkcja() ulegnie awarii

Podczas oceny kodu za pomocą nowego wywołania Function(), czy istnieje sposób, aby dowiedzieć się, gdzie w treści funkcji występuje błąd składni, jeśli ocenia się kod nielegalnej składni? tj .:

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

Kiedy budowa generatora nie powiedzie się, czy jest jakiś sposób, aby dowiedzieć się (z przeglądarki, nie używając jslint lub innej zewnętrznej biblioteki) Co było błędu lub gdy wystąpił?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype wspomina, że ​​SyntaxError ma właściwość filename i linenumber, ale są niezdefiniowane do dynamicznego kodu ocenianego poprzez nową function() konstruktora z tego co mogę powiedzieć, to opierając się na samego obiektu błędu nie wydaje się być rozwiązaniem . Czy istnieją alternatywne sposoby wprowadzenia kodu do przeglądarki, aby kod, jeśli wiemy, że ma błędy składniowe od nieudanego nowego wywołania funkcji, może zostać użyty do ustalenia, gdzie problem jest zgodny z używanym silnikiem JS?

(Oczywiście, gdyby celem było po prostu znalezienie błędów składni, jslint jako krok preprocesowy byłby rozwiązaniem typu "go-to", ale bardziej interesuje mnie to, czy przeglądarki mogą w pewien sposób zostać zgłoszone do raportu ta informacja, nawet jeśli w ograniczonej formie, jak "jest NIEPRAWIDŁOWY błąd on-line/char ...")

Odpowiedz

4

Afaik niemożliwe dowiedzieć się, gdzie się pojawił. ale możesz chcieć zobaczyć Exception.message, aby pobrać informacje o tym, jaki był błąd.

przykład: http://jsbin.com/IRoDiJIV/1/watch?js

+0

Znalazłem rozwiązanie, ale nie brałem pod uwagę błędów łowienia przy uruchamianiu kodu, to użyteczne uzupełnienie. –

+0

Ten przykład to wyjątek środowiska wykonawczego (konkretnie ReferenceError), a nie SyntaxError! Btw, twój przykład rzeczywiście rejestruje, gdzie wystąpił błąd: 'Błąd zgłoszony w linii 1, kolumna 0 w (): callundefinedFunction(); wywoływane z linii 18, kolumna 4 w () w http://run.jsbin.com/runner: generator(); wywoływane z linii 11, kolumna 7 w http://run.jsbin.com/runner: (funkcja() {' – Bergi

+0

to zrobiła? jaka właściwość/metoda użyłeś w błędzie? nie mógł znaleźć żadnych informacji w dokumencie lub w przykładzie (uruchomiony w chrome) – floww

1

znalazł rozwiązanie się stosując metodę simiar do setting breakpoints in evaled code

W panelu źródeł Chrome Dev narzędzi męska, umieścić następujące w ramach warunkowego przerwania na linii new Function (ponieważ jest to kod biblioteki i Nie mogę tego zmienić.)

(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

W jaki sposób uzyskujesz tekst błędu składni w' eval_js' z tego? – Bergi

+0

@Bergi , załaduje kod handler_js poprzez uri danych w nowym elemencie skryptu, który po uruchomieniu da błąd w konsoli, który możesz debugować w narzędziach Chrome i firebug –

+1

Ale czy jest możliwy dostęp do tego błędu programowo, bez żadnych Debuguj konsole? To właśnie OP chce zrobić – Bergi

Powiązane problemy