He envuelto el Net::SSH::Expect de Perl con un pequeño módulo para reducir el código repetitivo necesario para escribir una nueva secuencia de comandos de configuración para usar con nuestras tarjetas HP iLO. Mientras que, por un lado, quiero que este contenedor sea lo más delgado posible, para que colegas no programadores puedan usarlo, también quiero que esté lo mejor escrito posible.¿Cómo debo manejar los errores en los métodos de Perl y qué debo devolver de los métodos?
se usa de esta manera:
my $ilo = iLO->new(host => $host, password => $password);
$ilo->login;
$ilo->command("cd /system1");
$ilo->command("set oemhp_server_name=$system_name", 'status=0');
y esto es 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;
}
}
Tengo dos consultas relacionadas. Primero, ¿cómo debo tratar las respuestas que no coinciden con la respuesta esperada? Supongo que lo que estoy haciendo ahora es satisfactorio: al devolver undef
señalo que algo se rompió y mi croak()
dará como resultado un error (aunque con poca gracia). Pero se siente como un olor a código. Si Perl tuviera excepciones, plantearía una y dejaría que el código de llamada decidiera si ignorarlo o no/salir/imprimir una advertencia, pero no (bueno, en 5.8). Tal vez debería devolver algún otro objeto (iLO::response
, o algo así) que contenga un mensaje de error y el contenido de $ilo->before()
(que es solo Net :: SSH :: Expect's before()
)? Pero si hago eso, y tengo que ajustar cada $ilo->command
en una prueba para atraparlo, mis scripts van a estar llenos de texto repetitivo.
En segundo lugar, ¿qué debo devolver para tener éxito? Una vez más, mi hash que contiene más o menos la respuesta de Net :: SSH :: Expect hace el trabajo, pero no se siente "bien" de alguna manera. Aunque este ejemplo en Perl mi código en otros idiomas emite el mismo olor familiar: nunca estoy seguro de cómo o qué devolver de un método. ¿Que me puedes decir?
Nunca debe 'devolver undef()' ya que eso crea una lista de un elemento en el contexto de la lista. Simplemente 'return;' hará lo correcto en cualquier contexto. :) –