2009-03-25 5 views
5

これは"How can I get around a ‘die’ call in a Perl library I can’t modify?"のフォローアップです。Perlサブルーチンでキャッチしたエラーとキャッチしていないエラーの両方をどうやって処理するのですか?

私はライブラリを呼び出すサブルーチンを持っています - クラッシュ - ときには何度もあります。しかし、そのIエラー条件がある

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

:むしろソファそれぞれはeval {}と、このサブルーチン内のコールよりも、私はちょうどそれが死ぬことを許可し、私のサブルーチンを呼び出しレベルではeval {}を使用しますfunction()でcatchとdoを行うことができます。キャッチされたエラーとキャッチされていないエラーの両方に対して正しい動作を得るために、サブルーチンと呼び出しルーチンでエラーキャッチを設計する最も適切でエレガントな方法は何ですか?

答えて

8

ブロックevalは入れ子にすることができます。

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

あなたの括弧はすごいですね! +1 – Axeman

+0

さて、私は今朝彼らを磨きました。 –

0

私はあなたが何をしたいのか全くわからないんだけど、私はあなたがハンドラでそれを行うことができると思います。

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

eval{ function($param); 1 } or next; 
関連する問題