#perl
#perl
Вопрос:
У меня есть модуль, который должен выполнить некоторую проверку в начальном блоке. Это не позволяет пользователю увидеть бесполезное сообщение в строке (на этапе компиляции, см. Второе НАЧАЛО здесь).
Проблема в том, что если я умру внутри BEGIN, сообщение, которое я отправляю, будет похоронено BEGIN failed--compilation aborted at
. Однако я предпочитаю die
exit 1
, так как тогда это было бы возможно. Должен ли я просто использовать exit 1
или есть что-то, что я могу сделать, чтобы подавить это дополнительное сообщение?
#!/usr/bin/env perl
use strict;
use warnings;
BEGIN {
my $message = "Useful message, helping the user prevent Horrible Death";
if ($ENV{AUTOMATED_TESTING}) {
# prevent CPANtesters from filling my mailbox
print $message;
exit 0;
} else {
## appends: BEGIN failed--compilation aborted at
## which obscures the useful message
die $message;
## this mechanism means that the error is not trappable
#print $message;
#exit 1;
}
}
BEGIN {
die "Horrible Death with useless message.";
}
Ответ №1:
Когда die
вы создаете исключение, которое перехватывается на более раннем уровне вызова. Единственный обработчик, который будет перехватывать die
из вашего BEGIN
блока, — это компилятор, и он автоматически присоединяет строку ошибки, которая вам не нужна.
Чтобы избежать этого, вы можете либо использовать exit 1
найденное вами решение, либо установить новый обработчик матрицы:
# place this at the top of the BEGIN block before you try to die
local $SIG{__DIE__} = sub {warn @_; exit 1};
Комментарии:
1. Спасибо! Теперь все, что я получаю, это:
Some needed modules are missing or must be upgraded before configuring Alien::GSL. Those modules are: Sort::Versions
2. Я должен сказать, что это то, чего я хотел!