2010-10-09 4 views
11

Ich möchte, dass mein Skript perl stirbt, wenn eine Warnung generiert wird, einschließlich Warnungen, die von verwendeten Paketen generiert werden.Wie kann ich Perl sterben lassen, wenn eine Warnung generiert wird?

Zum Beispiel sollte diese sterben:

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'; wird nicht helfen, da es lexikalische ist. Test::NoWarnings macht auch nicht die Arbeit, da es das Skript nicht umbringt.

Antwort

9

Hinzufügen Antwort auf Rafl suchen:

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

    # DO YOUR WORST... 

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

(Das gilt auch für gilt: wenn ein Handler zu %SIG Hinzufügen es (meist) besser nicht überschreiben alle vorherigen Handler, sondern nennen es nach dem Code ausgeführt wird Signal-Handler wie $SIG{HUP}, $SIG{USR1}, etc. Sie nie wissen, ob ein anderes Paket (oder sogar eine andere Instanz von „Sie“) bereits einen Handler einrichten, die noch ausgeführt werden muss.)

+0

Dies ist der bessere Ansatz ... Genau wie C müssen die Signale kooperieren und kaskadieren oder Sie werden unbeabsichtigte Aktionen in einem Abstand haben, die globale Handler mit einem einzigen Wert modifizieren. – dawg

16

Ich glaube, Sie suchen nach $SIG{__WARN__} wie in perlvar dokumentiert. Ähnliches wie

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

könnte was Sie wollen.

+1

Aber beachten Sie, dass Sie ändern eine globale und könnte unbeabsichtigte Folgen sehen. Es wäre wahrscheinlich eine gute Idee, die Pakete zu überprüfen, die Sie für Änderungen an '$ SIG {__ WARN __}' verwenden. – darch

Verwandte Themen