Отсутствует ошибка в $@ для Perl Net::FTP
Выяснив (через SO, конечно), что ошибка плохая $ftp = Net::FTP->new()
звонок в $@
в то время как последующие ошибки могут быть получены $ftp->message()
У меня возникла небольшая проблема.
Мой код в основном:
while (1) {
# Wait for cycle start, then get file list into @filelist.
foreach $file (@filelist) {
my $ftp = Net::FTP->new ($host);
if (! $ftp) {
logError ("Could not connect to host [$host]: $@");
return;
}
# More FTP stuff below with $ftp->message() error checking.
$ftp->quit();
}
}
Кроме того: да, я знаю, что, вероятно, я могу сделать это за один сеанс FTP, но на данный момент есть веские причины оставить его в отдельных сеансах.
Теперь это вызывается в цикле, по одному разу для каждого файла, и все они идут на один и тот же хост, но с первой попытки в большинстве циклов я получаю немного другое поведение. Сценарий является долгосрочным, каждый цикл начинается с часа и получаса, так что это не проблема с первой попыткой после запуска программы, так как это происходит в циклах, отличных от первого.
Теперь я знаю, что эти соединения должны прерваться, просто потому, что машины, к которым я пытаюсь получить доступ, недоступны в моей сети разработки.
Проблема в том, что в файле журнала появляются следующие ошибки:
E 2012-02-05 18:00:13 Could not connect to host [example.com]:
E 2012-02-05 18:00:13 Could not connect to host [example.com]:
Net::FTP: connect: Connection refused
E 2012-02-05 18:00:14 Could not connect to host [example.com]:
Net::FTP: connect: Connection refused
Как видите, $@
Кажется, переменная не заполнена первым файлом цикла. Я немного отредактировал этот вопрос, так как только что заметил, что в последнем цикле все три строки содержат сообщение об ошибке. Возвращаясь к журналам с помощью команды:
grep refused logfile | awk '{print substr($3,1,5)}' | uniq -c
чтобы получить даты и счет, выдает следующую статистику:
3 11:00
3 11:30
3 12:00
3 12:30
3 13:00
3 13:30
2 14:00
3 14:30
3 15:00
3 15:30
3 16:00
2 16:30
2 17:00
2 17:30
2 18:00
2 18:30
2 19:00
3 19:30
указывая на то, что некоторые имеют правильное количество сообщений об ошибках, но не все.
Мне интересно, если кто-нибудь знает, почему это может быть так.
2 ответа
Попробуйте обновить http://cpansearch.perl.org/src/GBARR/libnet-1.22_01/Changes говорит
libnet 1.22_01 -- Mon May 31 09:40:25 CDT 2010
*Set $@ when ->new returns undef
Если вы используете версию libnet
до 1.22_01
, у него была небольшая ошибка в new
функция в отношении ответов, которые не начинаются с кода.
Например, FTP.pm 2.77
который из libnet 1.21
имеет следующий фрагмент:
unless ($ftp->response() == CMD_OK) {
$ftp->close();
$@ = $ftp->message;
undef $ftp;
}
С FTP.pm 2.77_2
от libnet 1.22_01
, это изменено на:
unless ($ftp->response() == CMD_OK) {
$ftp->close();
# keep @$ if no message. Happens, when response did not start with a code.
$@ = $ftp->message || $@;
undef $ftp;
}
Что-нибудь происходит между ->new
позвонить и распечатать $@
? Это может перезаписать значение $@
, поэтому, если это необходимо, сохраните значение для дальнейшего использования:
my $ftp = Net::FTP->new ($host);
my $potential_error = $@;
$whatever_that->can_call(eval => 'inside');
if (! $ftp) {
logError ("Could not connect to host [$host]: $potential_error");
}