Jeśli sam wygeneruję wyjątek JavaScript (np. throw "AArrggg"
), Jak mogę uzyskać ślad stosu (w Firebug lub w inny sposób)? Właśnie dostaję wiadomość.
edytować : Jak wiele osób poniżej opublikowało, możliwe jest uzyskanie śledzenia stosu dla wyjątku JavaScript, ale chcę uzyskać ślad stosu dla moich wyjątków. Na przykład:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
Kiedy foo
nazywa, chcę uzyskać ślad stosu, który zawiera połączenia do foo
, bar
, bar
.
javascript
stack-trace
David Wolever
źródło
źródło
throw 'arrrgh';
i wyglądają tak samo jak w przypadkuthrow new Error('arrrgh');
. Debuger Chrome nadal wymagathrow new Error('arrrgh');
jednak, jak wspomniano (ale Chrome wydaje się dawać znacznie bardziej szczegółowe ślady).Odpowiedzi:
Edycja 2 (2017):
We wszystkich nowoczesnych przeglądarkach możesz po prostu zadzwonić:
console.trace();
(MDN Reference)Edycja 1 (2013):
Lepszym (i prostszym) rozwiązaniem, jak wskazano w komentarzach do pierwotnego pytania, jest użycie
stack
właściwościError
obiektu w następujący sposób:To wygeneruje dane wyjściowe w następujący sposób:
Podanie nazwy funkcji wywołującej wraz z adresem URL, funkcją wywołującą itd.
Oryginał (2009):
Zmodyfikowana wersja tego fragmentu może nieco pomóc:
źródło
caller
jest on przestarzały icallee
został usunięty z trybu ścisłego ES5. Oto dlaczego stackoverflow.com/questions/103598/…Zauważ, że chrom / chrome (inne przeglądarki używające V8), a także Firefox mają wygodny interfejs, aby uzyskać śledzenie stosu poprzez właściwość stosu na obiektach Error .
Dotyczy to zarówno wyjątków podstawowych, jak i tych, które sam sobie rzucasz. (Uważa się, że korzystasz z klasy Error, co zresztą jest dobrą praktyką).
Zobacz szczegółowe informacje na temat dokumentacji V8
źródło
.stack
właściwość.console.error(e.stack);
aby wyglądał jak domyślny komunikat wyjątkuW Firefoksie wydaje się, że nie musisz rzucać wyjątku. Wystarczy to zrobić
źródło
window.onerror
, pokazuje prawie pusty stos tylko zonerror
funkcją.console.log(new Error().stack)
> :( > :( > :(Jeśli masz firebuga, w zakładce skryptu występuje przerwa na wszystkie błędy. Gdy skrypt osiągnie punkt przerwania, możesz spojrzeć na okno stosu firebuga:
źródło
Dobrym (i prostym) rozwiązaniem, jak wskazano w komentarzach do pierwotnego pytania, jest użycie
stack
właściwościError
obiektu w następujący sposób:To wygeneruje dane wyjściowe w następujący sposób:
Podanie nazwy funkcji wywołującej wraz z adresem URL i numerem linii, funkcją wywołującą itd.
Mam naprawdę skomplikowane i ładne rozwiązanie, które opracowałem dla projektu, nad którym obecnie pracuję, a ja je trochę wyodrębniłem i przerobiłem, aby je uogólnić. Oto on:
Sprawdź to na GitHub (obecnie v1.2)! Możesz go używać w podobny sposób
Console.debug("Whatever");
i, w zależności od ustawieńConsole
, wydrukuje dane wyjściowe i ślad stosu (lub po prostu proste informacje / nic więcej). Oto przykład:Pamiętaj, aby pobawić się ustawieniami w
Console
obiekcie! Możesz dodać odstępy między liniami śledzenia i całkowicie je wyłączyć. Tutaj jestConsole.trace
ustawione nafalse
:Możesz nawet wyłączyć pierwszy bit wyświetlanych informacji (ustawić
Console.settings.debug.showInfo
nafalse
) lub całkowicie wyłączyć debugowanie (ustawićConsole.settings.debug.enabled
nafalse
), dzięki czemu nigdy nie będziesz musiał ponownie komentować instrukcji debugowania! Wystarczy je zostawić, a to nic nie da.źródło
Nie sądzę, żeby było coś wbudowanego, z czego można by korzystać, ale znalazłem wiele przykładów ludzi, którzy sami sobie wymyślili.
źródło
throw { name: 'NameOfException', message: 'He's dead, Jim' }
.Możesz uzyskać dostęp do właściwości
stack
(stacktrace
w Operze)Error
instancji, nawet jeśli ją rzuciłeś. Chodzi o to, że musisz upewnić się, że używaszthrow new Error(string)
(nie zapomnij o nowym zamiastthrow string
.Przykład:
źródło
W przeglądarce Chrome możesz użyć
console.trace
metody: https://developer.chrome.com/devtools/docs/console-api#consoletraceobjectźródło
To da ślad stosu (jako tablicę ciągów) dla współczesnych Chrome, Opera, Firefox i IE10 +
Stosowanie:
Wyklucza ze stosu własne wywołanie, a także tytuł „Błąd” używany przez Chrome i Firefox (ale nie IE).
Nie powinno to powodować awarii starszych przeglądarek, ale po prostu zwracać pustą tablicę. Jeśli potrzebujesz bardziej uniwersalnego rozwiązania, zajrzyj na stacktrace.js . Lista obsługiwanych przeglądarek jest naprawdę imponująca, ale moim zdaniem jest bardzo duża do tego małego zadania, do którego jest przeznaczona: 37 KB zminimalizowanego tekstu z uwzględnieniem wszystkich zależności.
źródło
Aktualizacja odpowiedzi Eugene'a: Obiekt błędu musi zostać zgłoszony, aby IE (określone wersje?) Wypełnił
stack
właściwość. Następujące powinny działać lepiej niż jego obecny przykład i powinny unikać powrotuundefined
w IE.Uwaga 1: Tego rodzaju czynności należy wykonywać tylko podczas debugowania, a wyłączać na żywo, zwłaszcza jeśli są często wywoływane. Uwaga 2: To może nie działać we wszystkich przeglądarkach, ale wydaje się działać w FF i IE 11, co dobrze odpowiada moim potrzebom.
źródło
jednym ze sposobów uzyskania prawdziwego śladu stosu w Firebug jest utworzenie prawdziwego błędu, takiego jak wywołanie niezdefiniowanej funkcji:
Lub użyj
console.error()
po nimthrow
instrukcji, ponieważconsole.error()
pokazuje ślad stosu.źródło
Ten kod wypełniający działa w nowoczesnych przeglądarkach (2017) (IE11, Opera, Chrome, FireFox, Yandex):
Inne odpowiedzi:
nie działa w IE 11!
Korzystanie z arguments.callee.caller - nie działa w trybie ścisłym w żadnej przeglądarce!
źródło
W Google Chrome (wersja 19.0 i nowsze) po prostu zgłoszenie wyjątku działa idealnie. Na przykład:
pokaże ślad stosu na wyjściu konsoli przeglądarki:
Mam nadzieję, że to pomoże.
źródło
funkcjonować:
przypadek użycia:
źródło
ten skrypt pokaże błąd
źródło
źródło
Trochę późno na imprezę, ale oto inne rozwiązanie, które automatycznie wykrywa, czy arguments.callee jest dostępny, i używa nowego Error (). Stosu, jeśli nie. Testowane w Chrome, Safari i Firefox.
2 warianty - stackFN (n) daje nazwę funkcji n od bezpośredniego wywołującego, a stackArray () daje tablicę, stackArray () [0] jest bezpośrednim wywołującym.
Wypróbuj na http://jsfiddle.net/qcP9y/6/
źródło
Możesz skorzystać z tej biblioteki http://www.stacktracejs.com/ . To jest bardzo dobre
Z dokumentacji
źródło
https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js
to stara wersja, najnowsza stabilna wersja (https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Oto odpowiedź, która zapewnia maksymalną wydajność (IE 6+) i maksymalną zgodność. Kompatybilny z IE 6!
źródło
Łatwiej jest uzyskać ślad stosu w Firefoksie niż w IE, ale zasadniczo oto, co chcesz zrobić:
Zawiń „problematyczny” fragment kodu w blok try / catch:
Jeśli sprawdzisz zawartość obiektu „error”, zawiera on następujące pola:
e.nazwa_pliku: plik źródłowy / strona, z której pochodzi problem e.lineNumber: numer wiersza w pliku / stronie, na której powstał problem e.message: prosty komunikat opisujący, jaki typ błędu miał miejsce e.name: typ błędu, który miał miejsce, w powyższym przykładzie powinna to być „TypeError” e.stack: Zawiera ślad stosu, który spowodował wyjątek
Mam nadzieję, że to ci pomoże.
źródło
Musiałem zbadać niekończącą się rekurencję w smartgwt z IE11, więc aby zbadać głębiej, potrzebowałem śledzenia stosu. Problem polegał na tym, że nie mogłem korzystać z konsoli programisty, ponieważ w ten sposób odtwarzanie było trudniejsze.
Użyj następujących metod w metodzie javascript:
źródło
Wow - od 6 lat nie widzę ani jednej osoby, co sugeruje, że najpierw sprawdzamy, czy
stack
jest dostępna przed użyciem! Najgorszą rzeczą, jaką możesz zrobić w module obsługi błędów, jest zgłoszenie błędu z powodu wywołania czegoś, co nie istnieje.Jak powiedzieli inni, chociaż
stack
jest teraz w większości bezpieczny w użyciu, nie jest obsługiwany w IE9 ani wcześniejszych.Rejestruję moje nieoczekiwane błędy, a śledzenie stosu jest bardzo istotne. Aby uzyskać maksymalne wsparcie, najpierw sprawdzam, czy
Error.prototype.stack
istnieje i czy jest funkcją. Jeśli tak, to jest bezpieczny w użyciuerror.stack
.Edycja: Wygląda na to, że ponieważ
stack
jest to właściwość, a nie metoda, można ją bezpiecznie wywołać nawet w starszych przeglądarkach. Nadal jestem zdezorientowany, ponieważ byłem całkiem pewien, że sprawdzanieError.prototype
działało dla mnie wcześniej, a teraz nie - więc nie jestem pewien, co się dzieje.źródło
Używanie
console.error(e.stack)
przeglądarki Firefox pokazuje tylko dziennik stosu w dziennikach, Chrome wyświetla również komunikat. Może to być zła niespodzianka, jeśli wiadomość zawiera istotne informacje. Zawsze loguj oba.źródło
Spróbuj
Działa to całkiem dobrze w przypadku chrome:
źródło