2010-10-09 13 views
11

Vorrei che il mio script perl muoia ogni volta che viene generato un avviso, inclusi gli avvisi generati dai pacchetti usati.Come posso far morire Perl se viene generato un avviso?

Ad esempio, questo dovrebbe morire:

use strict; 
use warnings; 
use Statistics::Descriptive; 

my @data = (8, 9, 10, "bbb"); 
my $stat = Statistics::Descriptive::Full->new(); 
$stat->add_data(@data); 

use warnings FATAL => 'all'; non aiuterà dal momento che è con scope lessicale. Test::NoWarnings non esegue il lavoro poiché non uccide lo script.

risposta

9

Per aggiungere alla risposta è Rafl: quando si aggiunge un gestore per %SIG, è (di solito) meglio non sovrascrivere alcun gestore precedente, ma lo chiamano dopo aver eseguito il codice:

my $old_warn_handler = $SIG{__WARN__}; 
$SIG{__WARN__} = sub { 

    # DO YOUR WORST... 

    $old_warn_handler->(@_) if $old_warn_handler; 
}; 

(questo vale anche per gestori di segnale come $SIG{HUP}, $SIG{USR1}, ecc si sa mai se qualche altro pacchetto (o anche un altro esempio di "voi") già impostare un gestore che ha ancora bisogno di correre.)

+0

Questo è l'approccio migliore ... Proprio come C, i segnali devono cooperare e sovrapporsi o si avranno azioni non intenzionali a distanza che modificano i gestori globali con un singolo valore. – dawg

16

Credo che stiate cercando $SIG{__WARN__} come documentato in perlvar. Qualcosa di simile a

$SIG{__WARN__} = sub { die @_ }; 

potrebbe essere quello che vuoi.

+1

Ma notare che si sta cambiando un globale e potrebbe vedere conseguenze non intenzionali. Probabilmente sarebbe una buona idea controllare i pacchetti che usi per le modifiche a '$ SIG {__ WARN __}'. – darch

Problemi correlati