¿Cómo puedo evitar que mi script Perl termine si se lanza una excepción en un módulo que usa?
-
27-10-2019 - |
Pregunta
Tengo un script Perl, usando el código :: HTTP Net estándar :: HTTP y Perl 5.8.8. He encontrado una condición de error en la que el servidor devuelve 0 bytes de datos cuando llamo:
$_http_connection->read_response_headers;
Desafortunadamente, mi guión de Perl die
S, porque el módulo net :: http :: métodos tiene un "morir" en la línea 306:
Server closed connection without sending any data back at
/usr/lib/perl5/vendor_perl/5.8.8/Net/HTTP/Methods.pm line 306
Y las líneas 305-307 son, por supuesto:
unless (defined $status) {
die "Server closed connection without sending any data back";
}
¿Cómo puedo hacer que mi guión "recupere con gracia" de esta situación, detectando el die
y posteriormente entrando en mi propio código de manejo de errores, en lugar de die
ing sí mismo?
Estoy seguro de que este es un caso común, y probablemente algo simple, pero no lo he encontrado antes.
Solución
Puedes usar eval { }
atrapar die()
excepciones. Usar $@
Para inspeccionar el valor lanzado:
eval {
die "foo";
};
print "the block died with $@" if $@;
Ver http://perdoc.perl.org/functions/eval.html para detalles.
Otros consejos
Usando evaluación Para atrapar excepciones ocasionalmente puede ser problemático, especialmente antes de 5.14. Puedes usar Prueba :: Tiny.
Personalizando el die
significar que algo más es simple:
sub custom_exception_handler { ... } # Define custom logic
local $SIG{__DIE__} = \&custom_exception_handler; # Won't die now
# Calls custom_exception_handler instead
La gran ventaja de este enfoque sobre eval
es que no requiere llamar a otro intérprete de Perl para ejecutar el código problemático.
Por supuesto, el controlador de excepción personalizado debe ser adecuado para la tarea en cuestión.