Kiedy dostaję wyjątki, często dzieje się to z głębi stosu wywołań. Kiedy tak się dzieje, częściej niż nie, faktyczny wiersz kodu jest dla mnie ukryty:
tmp.rb:7:in `t': undefined method `bar' for nil:NilClass (NoMethodError)
from tmp.rb:10:in `s'
from tmp.rb:13:in `r'
from tmp.rb:16:in `q'
from tmp.rb:19:in `p'
from tmp.rb:22:in `o'
from tmp.rb:25:in `n'
from tmp.rb:28:in `m'
from tmp.rb:31:in `l'
... 8 levels...
from tmp.rb:58:in `c'
from tmp.rb:61:in `b'
from tmp.rb:64:in `a'
from tmp.rb:67
To obcięcie "... 8 poziomów ..." sprawia mi wiele kłopotów. Nie mam większego sukcesu w wyszukiwaniu tego w Google: Jak powiedzieć ruby, że chcę, aby zrzuty zawierały pełny stos?
ruby
exception
stack-trace
Sniggerfardimungus
źródło
źródło
Odpowiedzi:
W wyjątku # backtrace znajduje się cały stos:
(Zainspirowany blogiem Ruby Inside Petera Coopera )
źródło
raise
. Nie ma potrzeby jawnego określania wykonania, które chcesz podnieść.Możesz to również zrobić, jeśli potrzebujesz prostego, jednowierszowego:
źródło
raise
można tego użyć bez argumentów. Nie wiedziałem też, żerescue
będzie poprawnie traktowany jako jednolinijkowy. Całkowicie ignoruję też takie globalne vars$!
.puts "this line was reached by #{caller.join("\n")}"
y caller
do drukowania danych wyjściowych, takich jak ślad stosu Java.caller(0,2)
zwróci dwa ostatnie wpisy w stosie śledzenia. Przyjemne do drukowania skróconych śladów stosu.To daje opis błędu i ładny, czysty, wcięty ślad stosu:
źródło
IRB ma ustawienie tej okropnej „funkcji”, które możesz dostosować.
Utwórz plik o nazwie,
~/.irbrc
który zawiera następujący wiersz:Pozwoli to zobaczyć
irb
co najmniej 100 klatek stosu . Nie udało mi się znaleźć równoważnego ustawienia dla nieinteraktywnego środowiska wykonawczego.Szczegółowe informacje na temat dostosowywania IRB można znaleźć w książce Kilof .
źródło
Jedna wkładka do stosu wywołań:
Jedna linijka dla stosu wywołań bez wszystkich klejnotów:
Jedna linijka dla stosu wywołań bez wszystkich klejnotów i względem bieżącego katalogu
źródło
To naśladuje oficjalny ślad Rubiego, jeśli jest to dla Ciebie ważne.
Co zabawne, nie obsługuje poprawnie „nieobsługiwanego wyjątku”, zgłaszając go jako „RuntimeError”, ale lokalizacja jest poprawna.
źródło
Otrzymywałem te błędy podczas próby załadowania mojego środowiska testowego (przez test rake lub autotest), a sugestie IRB nie pomogły. Skończyło się na tym, że opakowałem cały test / test_helper.rb w blok start / ratunek i to naprawiło problem.
źródło
[zbadaj ślady wsteczne wszystkich wątków, aby znaleźć winowajcę]
Nawet w pełni rozwinięty stos wywołań może nadal ukrywać przed tobą właściwą linię kodu, gdy używasz więcej niż jednego wątku!
Przykład: jeden wątek iteruje ruby Hash, a inny próbuje go zmodyfikować. BUM! Wyjątek! Problem ze śladem stosu, który otrzymujesz, próbując zmodyfikować hash `` zajęty '', polega na tym, że pokazuje ci łańcuch funkcji aż do miejsca, w którym próbujesz zmodyfikować hash, ale NIE pokazuje, kto aktualnie iteruje go równolegle ( kto jest właścicielem)! Oto sposób, aby to sprawdzić, drukując ślad stosu dla WSZYSTKICH aktualnie uruchomionych wątków. Oto jak to robisz:
Powyższy fragment kodu jest przydatny nawet do celów edukacyjnych, ponieważ może pokazać (jak prześwietlenie), ile faktycznie masz wątków (w porównaniu z tym, ile myślisz, że masz - dość często te dwa to różne liczby;)
źródło
Możesz także użyć backtrace Ruby gem (jestem autorem):
źródło