【问题标题】:Missing error in $@ for Perl Net::FTPPerl Net::FTP 的 $@ 中缺少错误
【发布时间】:2012-02-05 10:31:24
【问题描述】:

在确定(当然是通过 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

表明有些错误消息的计数正确,但不是全部。

我想知道是否有人知道为什么会这样。

【问题讨论】:

    标签: perl net-ftp


    【解决方案1】:

    尝试升级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 具有以下sn-p:

    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;
    }
    

    【讨论】:

      【解决方案2】:

      ->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");
      }
      

      【讨论】:

      • 很好的信息,但没有。在这种情况下,newiflogError 与问题中显示的完全相同,没有中间代码。有一个信号处理程序,但它是为TERM 设置的,它将 aflag 设置为退出,因此在这种情况下不会发生这种情况(因为我们正在继续运行)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多