gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:50:15 25 4
gpt4 key购买 nike

我已经包装了 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/:\n\n",
$self->{ssh}->before()),
"\n";
return undef;
}
}

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

其次,我应该为成功返回什么?同样,我的散列或多或少包含来自 Net::SSH::Expect 的响应,但它在某种程度上感觉不“正确”。虽然这个例子是用 Perl 编写的,但我用其他语言编写的代码发出了同样熟悉的气味:我从不知道如何或从方法返回什么。你能告诉我什么?

最佳答案

如果您熟悉 Java 等语言的异常,请考虑 diethrowevaltrycatch .而不是返回 undef ,你可以这样做:

if ($self->{ssh}->waitfor($response, $self->{CMD_TIMEOUT}, '-re')) {
return {
before => $self->{ssh}->before(),
match => $self->{ssh}->match(),
after => $self->{ssh}->after(),
};
}

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

然后,在您的调用代码中:
eval { 
$ilo->command("set oemhp_server_name=$system_name", 'status=0');
};

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

就像其他语言中的异常一样,这允许您随时退出子方法,而不必担心在调用堆栈上传播返回值。他们会被第一个 eval 捕获。找到它们的 block 。此外,您可以 die再次抛出一个你无法处理的异常备份堆栈。

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

关于perl - 我应该如何处理 Perl 方法中的错误,我应该从方法中返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com