我用一個小模塊封裝了Perl的Net::SSH::Expect,以減少編寫新配置腳本所需的樣板代碼,以便與我們的HP iLO卡配合使用。儘管一方面我希望這個包裝儘可能精簡,所以非程序員的同事可以使用它,我也希望它儘可能地寫得很好。我應該如何處理Perl方法中的錯誤,以及我應該從方法返回什麼?
它用於像這樣:
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中,但我用其他語言的代碼發出了相同的熟悉的氣味:我不知道如何或從某個方法返回什麼。你能告訴我什麼?
您不應該`返回undef()`,因爲它會在列表上下文中創建一個元素列表。只要「迴歸」,在任何情況下都會做正確的事情。 :) – 2009-01-10 02:23:22