在弄清楚(当然是通过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
表示某些错误消息的数量正确但不是全部。
我想知道是否有人知道为什么会这样。
答案 0 :(得分:4)
尝试升级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
的{{1}}包含以下代码段:
libnet 1.21
来自unless ($ftp->response() == CMD_OK) {
$ftp->close();
$@ = $ftp->message;
undef $ftp;
}
的{{1}},此更改为:
FTP.pm 2.77_2
答案 1 :(得分:0)
->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");
}