¿Cómo puedo evitar que mi script Perl termine si se lanza una excepción en un módulo que usa?

StackOverflow https://stackoverflow.com/questions/8344551

  •  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 dieS, 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 dieing sí mismo?

Estoy seguro de que este es un caso común, y probablemente algo simple, pero no lo he encontrado antes.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top