JavaScript: Czy istnieje sposób, aby Chrome zepsuł wszystkie błędy?

258

Szukam w Chrome odpowiednika funkcji „włamuj się na wszystkie błędy” Firebug. Na karcie Skrypty Chrome „wstrzymuje wszystkie wyjątki”, ale nie jest to tak samo jak łamanie wszystkich błędów.

Na przykład podczas ładowania strony z następującym kodem chciałbym, aby Chrome złamał linię foo.bar = 42. Zamiast tego nawet po włączeniu opcji „Wstrzymaj na wszystkich wyjątkach” nie otrzymuję oczekiwanego rezultatu.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <script type="text/javascript">

            function doError() {
                foo.bar = 42;
            }

            window.onload = function() {
                try {
                    doError();
                } catch (e) {
                    console.log("Error", e);
                }
            }
        </script>
    </head>
    <body>
    </body>
</html>

Możesz wypróbować kod wklejony powyżej na tej stronie lub używając tego jsFiddle .

avernet
źródło
Jakie inne rodzaje błędów masz na myśli?
Matthew Crumley,
1
Każdy błąd, powiedzmy: odwołanie do niezdefiniowanej zmiennej (jak w console.log(gaga)) lub do niezdefiniowanej właściwości (jak w window.foo.bar).
avernet
2
Te powinny rzucać wyjątki. Opcja „pauza w wyjątkach” działa dla mnie. Jedyne błędy, które mogę wymyślić, które nie zadziałałyby, to błędy składniowe, ale występują one przed wykonaniem kodu.
Matthew Crumley,
1
Tak, próbuję tego teraz i wydaje się, że psuje się tam, gdzie jest błąd. Zrobiłem to kilka dni temu i zamiast rozbijać błąd w kodzie, łamał się tam, gdzie wychwytywany był wyjątek spowodowany błędem, znacznie wyżej. Domyśl!
avernet

Odpowiedzi:

210

Edycja: oryginalny link, na który odpowiedziałem, jest teraz nieprawidłowy . Nowszy adres URL to https://developers.google.com/web/tools/chrome-devtools/javascript/add-breakpoints#exceptions od 11.11.2016.

Zdaję sobie sprawę, że to pytanie ma odpowiedź, ale nie jest już dokładne. Użyj linku powyżej ^


(link zastąpiony edytowanym powyżej) - możesz teraz ustawić, aby łamał wszystkie wyjątki lub tylko nieobsługiwane. (Pamiętaj, że musisz być na karcie Źródła , aby zobaczyć przycisk).

Chrome dodał także teraz kilka innych naprawdę przydatnych funkcji punktu przerwania, takich jak łamanie zmian DOM lub zdarzeń sieciowych.

Normalnie nie odpowiedziałbym ponownie na pytanie, ale sam miałem to samo pytanie i znalazłem tę złą odpowiedź, więc pomyślałem, że umieszczę tę informację tutaj dla osób, które przyszły później w poszukiwaniu. :)

Brian Arnold Sinclair
źródło
1
Brian, dziękuję, to naprawdę działa teraz. Ta funkcja była już dostępna w lutym ubiegłego roku, kiedy to opublikowałem, ale nie działała poprawnie, podczas gdy wydaje się, że teraz działa dobrze. Dziękujemy za opinię.
avernet
Przycisk, do którego odwołuje się twój link, już go nie ma (przynajmniej w obecnej wersji Chrome dla kanału deweloperskiego). Nie jestem pewien, jak to zrobić ponownie.
Andriej Fiedorow
2
Cześć Andrey, patrzę na Chrome Canary i nadal widzę tam przycisk. Jest to czwarty przycisk od lewej, jak pokazano na d.pr/i/DHwT - kliknij raz i przejdzie w Pause on All Exceptions, gdzie drugie kliknięcie spowoduje przejście do Pause on Uncaught Exceptions. Trzecie kliknięcie powraca do domyślnego braku wstrzymywania.
Brian Arnold Sinclair
Link jest zepsuty, obawiam się :(
Rick,
1
Przepraszamy za to, że nie zobaczyłem komentarza wcześniej! Wygląda na to, że developers.google.com/web/tools/chrome-devtools/javascript/… ma treść poprzedniej treści. Zmienię również oryginalną odpowiedź, jeśli mogę.
Brian Arnold Sinclair
298

Mam problem z uzyskaniem go, dlatego publikuję zdjęcia pokazujące różne opcje:

Chrome 75.0.3770.142 [29 lipca 2018 r.]

Bardzo bardzo podobny interfejs od co najmniej Chrome 38.0.2125.111 [11 grudnia 2014 r.]

W zakładce Sources:

wprowadź opis zdjęcia tutaj

Po aktywowaniu przycisku możesz zaznaczyć Pause On Caught Exceptionspole wyboru poniżej: wprowadź opis zdjęcia tutaj


Poprzednie wersje

Chrome 32.0.1700.102 [03 lutego 2014]

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Chrome 27.0.1453.93 Stabilny

Opcje debugowania

Maxence
źródło
22
Muszę pochwalić Facebooka za linkowanie do tego bezpośrednio w swoich dokumentach. +1
jimm101
1
Uwaga: przyciski będą się po prostu ukrywać, jeśli pasek boczny nie zostanie rozwinięty, bez wskazania, że ​​tam są.
Eric Majerus
17

Jest to teraz obsługiwane w Chrome przez przycisk „Wstrzymaj na wszystkich wyjątkach”.

Aby to włączyć:

  • Przejdź na kartę „Źródła” w Narzędziach Chrome dla programistów
  • Kliknij przycisk „Wstrzymaj” u dołu okna, aby przełączyć na „Wstrzymaj w trybie wszystkich wyjątków”.

Zauważ, że ten przycisk ma wiele stanów. Klikaj przycisk, aby się przełączać

  • „Pauza we wszystkich wyjątkach” - przycisk ma kolor jasnoniebieski
  • „Wstrzymaj w przypadku niewyuczonych wyjątków” przycisk ma kolor fioletowy .
  • „Nie zatrzymuj się na wyjątkach” - przycisk ma kolor szary
Brad Parks
źródło
1

Prawie każdy błąd spowoduje wyjątki. Jedyne błędy, jakie mogę wymyślić, które nie działałyby z opcją „pauza na wyjątkach”, to błędy składniowe, które występują przed wykonaniem dowolnego kodu, więc i tak nie ma miejsca na pauzę i żaden kod nie zostanie uruchomiony.

Najwyraźniej Chrome nie zatrzyma się na wyjątku, jeśli znajduje się w bloku try-catch. Zatrzymuje się tylko w przypadku niewyłapanych wyjątków. Nie wiem, jak to zmienić.

Jeśli potrzebujesz tylko wiedzieć, w której linii wystąpił wyjątek (wtedy możesz ustawić punkt przerwania, jeśli wyjątek jest powtarzalny), Errorobiekt podany do bloku catch ma stackwłaściwość, która pokazuje, gdzie wystąpił wyjątek.

Matthew Crumley
źródło
Matthew, „odtworzyłem” coś podobnego do tego, co miałem (patrz zaktualizowane pytanie). Jakoś nie udało mi się uruchomić debugera na tym błędzie. Czy masz pojęcie, dlaczego to nie działa z Chrome (działa z Firebug, gdy włączasz „łamanie wszystkich błędów”).
avernet
@Mathhew, stworzyłem inną odpowiedź, mówiąc, że to niemożliwe, i oznaczyłem ją jako odpowiedź. Jeśli ty lub ktoś inny znajdzie rozwiązanie, zmienię znacznik.
avernet
1

Niestety narzędzia programistyczne w Chrome wydają się nie być w stanie „zatrzymać wszystkich błędów”, podobnie jak Firebug.

avernet
źródło
Wystarczy kliknąć przycisk Pauza JEDEN CZAS (będzie w kolorze niebieskim) i nie zaznaczać opcji Wstrzymaj przy złapanych wyjątkach. To wszystko zatrzyma się tylko w przypadku błędów.
Roy Shoa,