Почему не используются предупреждения 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
умереть.