Как я могу заставить Perl умереть, если генерируется предупреждение? - PullRequest
12 голосов
/ 09 октября 2010

Я бы хотел, чтобы мой скрипт 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 ]

17 голосов
/ 09 октября 2010

Я полагаю, что вы ищете $SIG{__WARN__}, как указано в perlvar. Нечто похожее на

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

может быть тем, что вы хотите.

9 голосов
/ 09 октября 2010

Добавление к ответу 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} и т. Д. никогда не знаете, если какой-то другой пакет (или даже другой экземпляр "вы") уже установить обработчик, который все еще должен работать.)

...