Wie gehe ich beide gefangen und nicht abgefangene Fehler in einem Perlfunktionen?
-
22-08-2019 - |
Frage
Dies ist ein Followup auf " Wie kann ich um eine 'sterben' in einer I Perl-Bibliothek aufrufen bekommen nicht ändern können? ".
Ich habe ein Unterprogramm, das eine Bibliothek-which-Crashes-Manchmal oft aufruft. Anstatt Couch in diesem Unterprogramm jeden Anruf mit einem eval {}, ich erlaube es nur zu sterben, und verwenden Sie ein eval {} auf das Niveau, das mein Unterprogramm aufruft:
my $status=eval{function($param);};
unless($status){print $@; next;}; # print error and go to
# next file if function() fails
Es gibt jedoch Fehlerbedingungen, die ich kann und in Funktion fangen Sie (). Was ist die richtige / elegante Art und Weise des Fehler Fang im Unterprogramm und die Aufrufroutine so zu gestalten, dass ich das richtige Verhalten für beide gefangen und nicht abgefangene Fehler bekommen?
Lösung
Block eval können verschachtelt werden:
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 $@ unless $@ eq "error that can be handled\n";
#handle the error
};
die "uncaught error";
}
eval { function(); 1 } or do {
warn "caught error $@";
};
Andere Tipps
Ich bin mir nicht ganz sicher, was Sie tun wollen, aber ich denke, Sie es mit einem Handler tun können.
$SIG{__DIE__} = sub { print $@ } ;
eval{ function($param); 1 } or next;