【问题标题】:How can I make Perl die if a warning is generated?如果生成警告,我怎样才能让 Perl 死掉?
【发布时间】:2011-04-23 04:51:54
【问题描述】:

我希望我的脚本 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 也不会做这项工作,因为它不会杀死脚本。

【问题讨论】:

    标签: perl warnings die


    【解决方案1】:

    我相信您正在寻找$SIG{__WARN__},如perlvar 中所述。类似于

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

    可能是你想要的。

    【讨论】:

    • 但请注意,您正在更改全局并且可能会看到意想不到的后果。审核您用于修改 $SIG{__WARN__} 的软件包可能是个好主意。
    【解决方案2】:

    添加到 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} 等信号处理程序。你 永远不知道是否已经有其他包(甚至是“你”的另一个实例) 设置一个仍需要运行的处理程序。)

    【讨论】:

    • 这是更好的方法...就像 C 一样,信号需要协作和级联,否则您将在远处使用单个值修改全局处理程序的意外操作。
    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多