PerlNet::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

指示一些具有错误消息的正确计数,但不是全部。

我想知道是否有人知道为什么会出现这种情况。

尝试升级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

如果您使用的是1.22_01之前的libnet版本,那么它在new函数中有一个小错误,涉及到不是以代码开头的响应。

例如,来自libnet 1.21FTP.pm 2.77具有以下代码段:

unless ($ftp->response() == CMD_OK) {
    $ftp->close();
    $@ = $ftp->message;
    undef $ftp;
}

FTP.pm 2.77_2libnet 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");
}

相关内容

  • 没有找到相关文章

最新更新