2017-08-15 66 views
8

W perlu 5, użyłbym dowolnej z funkcji Karpi. W perlu 6 wyszukiwanie nie było pomocne, a trace pragma wydrukuje wszystkie stosy, a nie tylko te, które chcę. Mogę używać tylko stary hack rzuca wyjątek, chwytając ją i drukuje go:Czy istnieje kanoniczny sposób drukowania śladu stosu w perlu 6?

try { 
    X::AdHoc.new(payload => 'Stack').throw; 
    CATCH { when X::AdHoc { .say; } } 
} 

Albo jest trochę leniwy:

{ 
    die; 
    CATCH { default { .say } } 
} 

Jaki jest właściwy sposób to zrobić?

Odpowiedz

7

Tak naprawdę znalazłem odpowiedź podczas pisania tego pytania i postanowiłem opublikować to tutaj, ponieważ nie pojawiło się ono w żadnym z moich poprzednich wyszukiwań. Backtrace klasy Perl 6 będzie uzyskać ślad stosu i przekonwertować go na ciąg: (. Użyj Backtrace.new.full zobaczyć kilka dodatkowych ramek stosu niskopoziomowych, które normalnie są ukryte)

say "Stack: " ~ Backtrace.new; 

+1

Co robi swój kod ostateczny wygląd lubić? –

+0

@ ChristopherBottoms To było to. 'Backtrace.new.Str' podaje bieżący ślad stosu jako ciąg znaków. Zaloguj się, zapisz, przetwórz. (Ale gdybyś to analizował, nie nazywałbyś '.Str'.) Uzyskałbyś dostęp do innych metod obiektu" Backtrace ".) – piojo

+0

Oh, okay. Po prostu chcesz sprawdzić ślad stosu w określonym miejscu w kodzie bez konieczności wyrzucania wyjątku. –