5

これは、「変更できない Perl ライブラリで 'die' 呼び出しを回避するにはどうすればよいですか?」の続きです。.

Library-Which-Crashes-Sometimes を何度も呼び出すサブルーチンがあります。このサブルーチン内の各呼び出しを eval{} で解決するのではなく、終了させて​​、サブルーチンを呼び出すレベルで eval{} を使用します。

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

ただし、function() でキャッチできるエラー条件があります。キャッチされたエラーとキャッチされていないエラーの両方に対して正しい動作が得られるように、サブルーチンと呼び出しルーチンでエラーキャッチを設計する最も適切でエレガントな方法は何ですか?

4

2 に答える 2

8

ブロック評価はネストできます:

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 $@";
};
于 2009-03-25T22:08:30.180 に答える
0

何をしたいのか完全にはわかりませんが、ハンドラーでできると思います。

$SIG{__DIE__} = sub { print $@ } ;

eval{ function($param); 1 } or next;
于 2009-03-25T22:17:22.997 に答える