2009-03-25 22 views
5

Đây là lần theo dõi "How can I get around a ‘die’ call in a Perl library I can’t modify?".Làm cách nào để xử lý cả lỗi bị bắt và lỗi trong một chương trình con Perl?

Tôi có một chương trình con gọi là Thư viện-Sự cố-Đôi khi nhiều lần. Thay vì chiếc ghế mỗi cuộc gọi trong phạm vi chương trình con này với một eval {}, tôi chỉ cho phép nó chết, và sử dụng một eval {} vào mức độ mà các cuộc gọi chương trình con của tôi:

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

Tuy nhiên, có điều kiện lỗi mà tôi có thể và bắt trong hàm(). Cách thích hợp nhất/thanh lịch để thiết kế các lỗi bắt buộc trong chương trình con là gì và thói quen gọi điện thoại để tôi có được hành vi đúng cho cả hai lỗi bị bắt và không bị bắt?

Trả lời

8

Khối eval có thể được lồng vào nhau:

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

Dấu ngoặc của bạn trông có vẻ lộng lẫy! +1 – Axeman

+0

Vâng, tôi đã đánh bóng chúng sáng nay. –

0

Tôi không hoàn toàn chắc chắn những gì bạn muốn làm, nhưng tôi nghĩ bạn có thể làm điều đó với một handler.

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

eval{ function($param); 1 } or next; 
Các vấn đề liên quan