2009-04-10 12 views
23

W języku Perl istnieje sposób na wymuszenie wszystkich błędów krytycznych, aby wyświetlić ślad stosu, taki jak Carp::confess?Jak wymusić śledzenie stosu dla wszystkich błędów krytycznych w Perlu?

Wiem, że możesz zrobić use warnings FATAL => 'all';, aby ostrzeżenia były śmiertelne w stosunku do aktualnego zakresu leksykalnego.

Co więcej, możliwe jest użycie $SIG{__WARN__} = sub { CORE::die(@_) };, aby wszystkie ostrzeżenia były śmiertelne wszędzie (nie zlokalizowały programu obsługi SIGWARN).

Czy jest to czysty sposób, czy muszę zmodyfikować SIGDIE? A jeśli piszę program obsługi SIGDIE, jaki jest najlepszy sposób na uzyskanie śladu?

Idealne rozwiązanie działa ze standardowymi bibliotekami testowymi, Test::More i znajomymi.

Aktualizacja: Mark Johnson sugeruje użycie programu obsługi SIGDIE do wywołania Carp::confess. Działa ładnie. Oto kod:

use Carp; 
$SIG{ __DIE__ } = sub { Carp::confess(@_) }; 
+0

To samo pytanie, więcej odpowiedzi: [Jak mogę wymienić wszystkie "umieść z" wyznaniem "w aplikacji Perla?] (Http://stackoverflow.com/q/1877638/269126) – Lumi

Odpowiedz

16

Zainstaluj program obsługi SIGDIE, który wywołuje Carp :: przyznać się? Lub po prostu ustawić Carp :: wyznać jako handler dla DIE?

Uwaga na standard gotchas związane z eval. Istnieje nawet weirder gotcha w odniesieniu do bloków BEGIN. Zwróć też uwagę na ominous warning in perlvar.

Aby uzyskać więcej informacji na temat generowania wykresów stosu, zobacz numer this question.

+0

Nie wiem, dlaczego ja nie myślałem o tym. To działa. – daotoad

11

Zobacz także moduł "Carp::Always", który zamienia wszystkie matryce i ostrzega w kodzie do stacktraces.

Powiązane problemy