Почему не используются предупреждения FATAL => "все", кажется, работает?

Этот скрипт:

use warnings FATAL => 'all';

warn 'warning';
die 'death';

... приводит к тому, что "предупреждение" регистрируется, но не умирает в этот момент, а умирает со "смертью".

У меня есть модуль mod_perl, который переопределяет $main::SIG{__DIE__} в основном выкладывать сообщения die() в браузер во время разработки, но это не касается SIG{__WARN__}Так что же здесь происходит?

Это на Perl 5.10.1 на Windows Server 2003, с "-w" в PerlSwitches.

2 ответа

Решение

Вы неправильно поняли цель warnings прагма Он должен выдать предупреждающее сообщение для совершенно законных, но, возможно, неправильных операций. Пример:

use warnings;
my ($x, $y) = ("hello", "world");
say "same" if $x == $y;

Argument "world" isn't numeric…, Мы можем сделать определенные категории приводить к фатальным ошибкам с use warnings FATAL => $CATEGORY с такими категориями, как numeric или же uninitialized, all категория представляет все категории.

Это не меняет семантику каждого warn в die, Вы можете сделать это самостоятельно, например, с переопределением local $SIG{__WARN__} или создание warn функция, которая делает croak @_, Вы даже можете переопределить CORE::GLOBAL::warn изменить все warn с, даже если они находятся в других модулях.

CGI::Carp модуль имеет warningsToBrowser вариант; Вы можете посмотреть на исходный код, чтобы увидеть, как он реализован.

Кажется, это не работает, потому что ваш тест не проверяет то, что вы хотите проверить. Попробуй это:

use warnings FATAL => 'all';

print undef;
die 'death';

Просто как no warnings не помешает warn от работы, warnings FATAL не сделаю warn умереть.

Другие вопросы по тегам