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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top