加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

我应该如何处理Perl方法中的错误,以及从方法中返回什么?

发布时间:2020-12-15 21:49:07 所属栏目:大数据 来源:网络整理
导读:我用一个小模块包装了Perl的 Net::SSH::Expect,以减少编写用于HP iLO卡的新配置脚本所需的样板代码.虽然我一方面希望这个包装器尽可能精简,但非程序员同事可以使用它,我也希望它尽可能好地编写. 它的使用方式如下: my $ilo = iLO-new(host = $host,password
我用一个小模块包装了Perl的 Net::SSH::Expect,以减少编写用于HP iLO卡的新配置脚本所需的样板代码.虽然我一方面希望这个包装器尽可能精简,但非程序员同事可以使用它,我也希望它尽可能好地编写.

它的使用方式如下:

my $ilo = iLO->new(host => $host,password => $password);
$ilo->login;

$ilo->command("cd /system1");
$ilo->command("set oemhp_server_name=$system_name",'status=0');

这是iLO :: command():

sub command {
    my ($self,$cmd,$response) = @_;

    $response = 'hpiLO-> ' unless defined($response);

    # $self->{ssh} is a Net::SSH::Expect object
    croak "Not logged in!n" unless ($self->{ssh});

    $self->{ssh}->send($cmd);
    if ($self->{ssh}->waitfor($response,$self->{CMD_TIMEOUT},'-re')) {
        return {
            before => $self->{ssh}->before(),match => $self->{ssh}->match(),after => $self->{ssh}->after(),};
    } else {
        carp "ERROR: '$cmd' response did not match /$response/:nn",$self->{ssh}->before()),"n";
        return undef;
    }
}

我有两个相关的问题.首先,我应该如何处理与预期响应不匹配的响应?我想我现在正在做的事情是令人满意的 – 通过返回undef我发出信号,我的croak()会输出一个错误(虽然不是很优雅).但感觉就像代码味道.如果Perl有异常,我会提出一个并让调用代码决定是否忽略它/退出/打印一个警告,但它没有(好吧,在5.8中).也许我应该返回一些带有错误消息的其他对象(iLO :: response或其他东西)和$ilo-> before()的内容(这只是Net :: SSH :: Expect的before())?但是如果我这样做 – 并且必须在测试中包装每个$ilo->命令来捕获它 – 我的脚本将再次充满样板.

其次,我应该回归什么才能获得成功?同样,我的哈希包含来自Net :: SSH :: Expect的响应或多或少可以完成工作,但它不会以某种方式感觉“正确”.虽然这个例子在Perl我的代码在其他语言中发出了同样熟悉的气味:我从来不知道如何或从一个方法返回什么.你能告诉我什么?

解决方法

如果您熟悉Java等语言的异常,那么可以将die视为throw和eval,如try和catch.而不是返回undef,你可以做这样的事情:
if ($self->{ssh}->waitfor($response,'-re')) {
    return {
        before => $self->{ssh}->before(),};
}

die "ERROR: '$cmd' response did not match /$response/:nn" 
. $self->{ssh}->before();

然后,在您的调用代码中:

eval { 
    $ilo->command("set oemhp_server_name=$system_name",'status=0');
};

if ( my $error = $@ ) { 
    # handle $error here
}

就像其他语言中的异常一样,这允许您在任何时候摆脱子方法,而不必担心在调用堆栈中传播返回值.它们将被找到它们的第一个eval块捕获.此外,您可以再次死亡以重新抛出一个您无法处理备份的异常.

更好的是,您可以使用die来抛出一个对象,您的异常处理程序可以查询该对象以获取有用的信息和错误消息.我喜欢用Exception::Class来达到这个目的. Error模块也为类似Java的try / catch块提供了一些语法糖.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读