2017-01-06 7 views
11

Mam ta linia wymyślić w konsoli, tylko w Firefoksie, z mojej aplikacji JavaScript Zajmuję:Jak debugować „przechwycony wyjątek: niezdefiniowany (brak danych)” w Firefoksie

Console log of Exception

It wydaje się stosunkowo nieszkodliwe, ale jestem ciekawy, czy istnieje jakiś sposób na wywnioskowanie jego pochodzenia, ponieważ musi skądś pochodzić, nawet jeśli twierdzi "nieznany". Zawinięcie całego skryptu w bloku try/catch i przełączenie ustawienia "Wstrzymaj wyjątek" w Firefoksie nic nie robi, co wydaje się sugerować, że jest to wyjątek specjalny? Mam pewne pomysły, które mogą być spowodowane przez części mojego kodu, które używają API Working Draft, ale jestem bardziej zainteresowany tym, dlaczego raportuje w ten sposób i co mogę z tym zrobić. Czy Firefox nie dostarcza więcej szczegółów?

+1

użyć innej przeglądarki - Chrome czasami pomóc debugowania problemów że Firefox (lub Firebug) nie złapie. – user2182349

+2

@ user2182349 Ten problem nie pojawia się w ogóle w przeglądarce Chrome. Naprawdę nie jest to ważne, jestem ciekawy, czy istnieje jakikolwiek sposób na interakcję z takim problemem lub dlaczego Firefox to robi. – MattTreichelYeah

+1

po otwarciu Debuggera na karcie debugera, po kliknięciu narzędzia po prawej stronie. istnieje opcja o nazwie, wstrzymaj na wyjątku, a także chcesz odznaczyć ignorowanie złapanych wyjątków, a następnie załaduj ponownie stronę – tik27

Odpowiedz

3

Istnieje kilka sposobów na zmiażdżenie tego błędu.

Jedno to bardzo uciążliwe, ale będzie Ci numer wiersza wyjątku jest kod, który wygląda następująco:

foo(); 
console.log("Line 1"); 
bar(); 
console.log("Line 2"); 
baz(); 
console.log("Line 3"); 

i tak dalej, a jeśli się to w konsoli:

Line 1 
Line 2 
Uncaught exception: undefined 

następnie wiesz, że baz() spowodował błąd. Innym sposobem jest użycie debuggera, tak:

debugger; 
foo(); 
bar(); 
baz(); 

i można go używać debuggera Firefoksa iść na każdej linii i zobaczyć, który zgłasza błąd na konsoli.

Jeśli masz dużo kodu, można spróbować sztuczki dziel i zwyciężaj, tak:

var fooStr = foo(); 
var fooArr = fooStr.split(""); 
fooArr = fooArr.reverse(); 
foo(fooArr.join("")); 
console.log("Block one"); 

var barStr = bar(); 
var barArr = barStr.split(""); 
barArr = barArr.reverse(); 
bar(barArr.join("")); 
console.log("Block two"); 

var bazStr = baz(); 
var bazArr = bazStr.split(""); 
bazArr = bazArr.reverse(); 
baz(bazArr.join("")); 
console.log("Block three"); 

Następnie, jeśli konsola wygląda następująco:

Block one 
Uncaught exception: undefined 

Następnie problem jest w bloku 2. Następnie, można to zrobić:

var barStr = bar(); 
console.log("Line 1"); 
var barArr = barStr.split(""); 
console.log("Line 2"); 
barArr = barArr.reverse(); 
console.log("Line 3"); 
bar(barArr.join("")); 
console.log("Line 4"); 
console.log("Block two"); 
console.log("Line 5"); 

A jeśli widzisz:

Line 1 
Uncaught exception: undefined 

Wtedy wiesz, że var barArr = barStr.split(""); to twój problem. Od tego czasu, może chcesz się zalogować wartości zmiennych, takich jak to:

console.log(barStr); 
var barArr = barStr.split(""); 

A jeśli to zobaczyć w konsoli:

undefined 
Uncaught exception: undefined 

Wtedy wiesz, że bar() wraca undefined (zamiast łańcucha), który nie ma metody split. Następnie spojrzysz na kod paska, aby określić, czy, powiedzmy, zapomniałeś parametru? Mabey bar wygląda następująco:

function bar(value){ 
    return strings[value]; 
} 

i strings jest obiektem coś w nim. Dlatego strings[undefined] zwróci undefined, który nie ma metody split. Bug zmiażdżył!

+0

Doceniam wysiłek, ale wiem o debugowaniu console.log. Uruchamiając przykład ".split()", Firefox zwraca "TypeError: barStr jest niezdefiniowany" - o wiele bardziej opisowy błąd niż to, z czym mam do czynienia, więc nie mam pewności, czy wiesz, o co tutaj pytam. Próbowałem użyć polecenia debuggera w Firefoksie, ale zdawało się, że zawiesiłem przeglądarkę, gdy wchodziłem w interakcję ze stroną podczas pauzy, a gdy o tym nie wspominałem, mój kod jest ciągle uruchamiany w ramkach animacji, więc konsola.logowanie i przechodzenie przez kod isn wystarczająco dużo, aby uchwycić dokładną ramkę, w której wystąpił błąd. – MattTreichelYeah

+0

Zignoruj ​​przykładowy kod '.split()'. Spróbuj umieścić 'console.log (" Dev console! ")' W górnej części pliku i uruchom go. Jeśli nic nie widzisz w konsoli, masz osobny problem. W przeciwnym razie, umieść 'console.log()' po każdej linii, aby znaleźć naruszającą linię. – programmer5000

+0

Jeśli to była odpowiedź, której szukasz, lub odpowiedział dobrze na twoje pytanie, zaznacz ją jako zaakceptowaną. W przeciwnym razie wyjaśnij, czego szukasz w komentarzu lub edytorze na swoje pytanie. – programmer5000

1

Możesz przejść do: about: config i stwórz preferencję boolean dom.report_all_js_exceptions.
Wymusi to znacznie więcej wyjątków pojawi się w konsoli błędów.

https://developer.mozilla.org/en-US/docs/Archive/Mozilla/Exception_logging_in_JavaScript

+0

Nie widzę tej opcji w moim: config. Używam Firefoksa 50 (aktualna wersja?). – MattTreichelYeah

+1

Możesz przejść do: about: config, ** right click ** na liście preferencji, następnie z menu kontekstowego wybierz ** New/Boolean **, wprowadź * "dom.report_all_js_exceptions" * dla nazwy i * "true" * dla wartości. –

+0

Dzięki, spróbowałem i ponownie uruchomiłem przeglądarkę, ale wydaje się, że nie pomaga ona w rozwiązaniu tego problemu. – MattTreichelYeah

2

znalazłem prosty przykład, który reprodukuje błąd widzisz.

<!doctype html> 
<html> 

<head> 
    <meta charset="utf-8"> 
    <script> 
     throw undefined 
    </script> 
</head> 

<body> 
</body> 

</html> 

Konsola firefox pokazuje:

uncaught exception: undefined (unknown) 

który jest dokładnie to, co masz. To prowadzi mnie do przekonania, że ​​błąd występuje w skrypcie osadzonym w twoim html.

Wiedząc, że możesz chcieć przenieść wszystkie takie skrypty do swoich własnych plików, aby móc normalnie debugować swój kod.

UPDATE

Przypadkowo znalazłem inny sposób można dostać taki błąd. I występuje w postaci eval.

index.html

<!doctype html> 
<html> 
<head> 
    <script src="script.js"></script> 
</head> 
<body></body> 
</html> 

script.js

eval('throw undefined'); 
+0

Interesujące, ale nie mam żadnych wbudowanych skryptów, tylko jeden zewnętrzny plik. Myślę, że może to mieć coś wspólnego z tym, jak Firefox obsługuje wyjątki w kodzie wewnętrznym. – MattTreichelYeah

Powiązane problemy