2009-03-25 11 views
5

Este es un seguimiento de "How can I get around a ‘die’ call in a Perl library I can’t modify?".¿Cómo manejo errores atrapados y no detectados en una subrutina de Perl?

Tengo una subrutina que llama Biblioteca-Que-Se bloquea-A veces muchas veces. En lugar de sofá cada llamada dentro de este subprograma con una eval {}, acabo de dejar que se muera, y el uso de un eval {} en el nivel que me llama la subrutina:

my $status=eval{function($param);}; 
unless($status){print [email protected]; next;}; # print error and go to 
            # next file if function() fails 

Sin embargo, hay condiciones de error que me puede y atrapa en función(). ¿Cuál es la forma más adecuada/elegante de diseñar la captura de errores en la subrutina y la rutina de llamadas para que obtenga el comportamiento correcto para los errores detectados y no detectados?

Respuesta

8

bloque eval puede anidarse:

sub function { 
    eval { 
     die "error that can be handled\n"; 
     1; 
    } or do { 
     #propagate the error if it isn't the one we expect 
     die [email protected] unless [email protected] eq "error that can be handled\n"; 
     #handle the error 
    }; 
    die "uncaught error"; 
} 

eval { function(); 1 } or do { 
    warn "caught error [email protected]"; 
}; 
+0

¡Sus corchetes se ven espectaculares! +1 – Axeman

+0

Bueno, los he pulido esta mañana. –

0

no estoy completamente seguro de lo que quiere hacer, pero creo que se puede hacer con un controlador.

$SIG{__DIE__} = sub { print [email protected] } ; 

eval{ function($param); 1 } or next; 
Cuestiones relacionadas