【问题标题】:Handling Exception in Perl在 Perl 中处理异常
【发布时间】:2016-06-09 07:54:15
【问题描述】:

我是 perl 新手,我已经为 ftp 文件传输创建了一个 perl 脚本。

但如果$ftp->login 不成功,程序将终止并显示以下错误消息:

Uncaught exception from user code:
        Cannot login Login incorrect.
 at ftp.sender.com line 89

程序代码片段:

$ftp->login($config->[$i]->{'USERNAME'},$config->[$i]->{'PSWD'}) or die "Cannot login ", $ftp->message;

有没有办法处理这个异常/登录不成功,让程序不会终止?

【问题讨论】:

  • well 关键字“die”会终止程序。将“die”替换为您希望程序执行的操作...例如 $ftp->login($config->[$i]->{'USERNAME'},$config->[$i]->{' PSWD'}) 或打印“无法登录”,$ftp->message;
  • 请参阅Try::Tiny 了解高级异常处理。
  • 谢谢!有效
  • 还有哪个是识别登录是否成功的最佳方法?成功登录后,我得到了 $ftp->code = 230 和 $ftp->status =2。我们可以这样验证吗? $ftp->status 是否意味着成功?
  • 如果登录没有返回 false 值,则表示登录成功。这就是or 所做的。如果返回undef或者0(不知道是哪一个),就会调用or的RHS。

标签: perl ftp


【解决方案1】:

只有在登录有效的情况下,您有几种不同的方式来做事。

  • 让整个程序die

    你已经知道那个了。如果登录失败,整个程序将停止。它之所以有效,是因为login 在成功时返回真值,在失败时返回假值。所以如果undef得到return,就会调用or的RHS,也就是die

    $ftp->login($user, $pw) or die "Cannot login ", $ftp->message;
    
  • 使用do

    如果您想坚持使用or,可以使用do { ... } 块将多个语句分组。这很奇怪。

    $ftp->login($user, $pw) or do { 
        stuff();
        more_stuff();
    };
    
  • 查看login的返回值

    如果您将login 放在if 中,则可以调用任意数量的代码。

    if ( $ftp->login($user, $pw) ) {
         stuff();
         more_stuff();
    }
    
  • 把它全部放在一个sub中,让login返回

    将所有的 FTP 东西组合到一个子中并调用它。如果其中一个步骤失败,则从 sub 返回。要获取错误消息,您可以返回 ftp 对象并在外面检查最终是否成功。

    sub ftp_stuff {
        my ($foo) = @_;
        $ftp->login($user, $pw) or return $ftp;
        $ftp->stuff($foo) or return $ftp;
    
        return $ftp;
    }
    
    # and somewhere else
    my $ftp = ftp_stuff($bar);
    die "Something went wrong: ", $ftp->message if $ftp->message;
    
  • 使用die 或异常和Try::Tiny

    最好的方法是使用 Try::Tiny。

    use Try::Tiny;
    
    try {
        $ftp->login($user, $pw) or die "Cannot login ", $ftp->message;
        stuff() or die "stuff ", $ftp->message;
        # ...
    } catch {
        # exception/error is in $_
        warn "Could not log in" if /Cannot login/;
        # ...
    };
    
    # continue with your program
    

    Try::Tiny 的替代方法是 an eval block

    eval {
        $ftp->login($user, $pw) or die "Cannot login ", $ftp->message;
        stuff() or die "stuff ", $ftp->message;
        # ...
    };
    if ($@) {
        # exception/error is in $@
        warn "Could not log in" if $@ =~ /Cannot login/;
        # ...
    };
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2020-06-26
    相关资源
    最近更新 更多