如果生成警告,如何使Perl死掉?

时间:2010-10-09 15:04:04

标签: perl warnings die

我希望我的脚本perl在生成警告时死亡,包括由使用过的包生成的警告。

例如,这应该死:

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';无济于事,因为它是词法范围的。 Test::NoWarnings也没有完成工作,因为它不会杀死脚本。

2 个答案:

答案 0 :(得分:17)

我相信您正在寻找perlvar中记录的$SIG{__WARN__}。类似于

的东西
$SIG{__WARN__} = sub { die @_ };

可能就是你想要的。

答案 1 :(得分:9)

添加到rafl的答案:向%SIG添加处理程序时,(通常)最好不要覆盖任何以前的处理程序,但在执行代码后调用它:

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

    # DO YOUR WORST...

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

(这也适用于$SIG{HUP}$SIG{USR1}等信号处理程序 永远不知道是否有其他包(或者甚至是“你”的另一个实例) 设置一个仍然需要运行的处理程序。)