2009-03-25 10 views
5

Questo è un seguito per "How can I get around a ‘die’ call in a Perl library I can’t modify?".Come gestisco entrambi gli errori rilevati e non rilevati in una subroutine Perl?

Ho una subroutine che chiama una libreria-quale-crash-A volte molte volte. Invece di divano ogni chiamata all'interno di questa subroutine con un eval {}, ho solo permettono di morire, e utilizzare un eval {} al livello che chiama il mio subroutine:

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

Tuttavia, ci sono condizioni di errore che ho può e fa prendere in funzione(). Qual è il modo più corretto/elegante per progettare l'intercettazione degli errori nella subroutine e nella routine di chiamata in modo da ottenere il comportamento corretto sia per gli errori rilevati che per quelli non rilevati?

risposta

8

blocco eval può essere nidificato:

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

Le parentesi sembrano spiffy! +1 – Axeman

+0

Bene, li ho lucidati stamattina. –

0

io non sono del tutto sicuro di quello che si vuole fare, ma credo che si può fare con un gestore.

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

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