2009-04-10 13 views
23

In Perl, c'è un modo per forzare tutti gli errori fatali a visualizzare uno stack backtrace come produce Carp::confess?Come impongo uno stack backtrace per tutti gli errori fatali in Perl?

So che si può fare use warnings FATAL => 'all'; per rendere gli avvisi fatali sull'attuale ambito lessicale.

Inoltre è possibile utilizzare $SIG{__WARN__} = sub { CORE::die(@_) }; per rendere irreversibili tutti gli avvisi (che non ha localizzato il gestore SIGWARN).

C'è un modo pulito per farlo o devo modificare SIGDIE? E se scrivo un gestore SIGDIE, qual è il modo migliore per ottenere la traccia?

Una soluzione ideale funzionerebbe con le librerie di test standard, Test::More e con gli amici.

Aggiornamento: Mark Johnson suggerisce di utilizzare un gestore SIGDIE per chiamare Carp::confess. Funziona bene. Ecco il codice:

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

Stessa domanda, più risposte: [Come posso sostituire tutti i 'die' con 'confess' in un'applicazione Perl?] (Http://stackoverflow.com/q/1877638/269126) – Lumi

risposta

16

Installare un gestore SIGDIE che chiama Carp :: confess? O appena creato Carp :: confess come gestore per DIE?

Attenzione al standard gotchas relativo alla valutazione. C'è anche un weirder gotcha per quanto riguarda i blocchi BEGIN. Si noti anche lo ominous warning in perlvar.

Vedere this question per ulteriori informazioni sulla generazione di tracce di stack.

+0

Non so perché I non ci ho pensato. Funziona. – daotoad

11

Vedere anche il modulo "Carp::Always", che trasforma tutti gli stampi e avverte nel codice in stacktraces.

Problemi correlati