2010-01-12 21 views
5

Tôi có đoạn code perl sau:Tại sao Perl không đánh giá được vấn đề từ Test :: Cmd :: Common-> unlink?

use strict; 
use warnings; 
use Test::Cmd::Common; 

my $path = "/something/not/available"; 
my $test = Test::Cmd::Common->new(string => 'File system operations'); 

eval{ 
     $test->unlink("$path"); 
}; 
ok([email protected], "file unlike"); 

print "done.\n"; 

Các $ Test-> unlink() dòng sẽ thất bại và ném ngoại lệ. nhưng vấn đề: eval không xử lý ngoại lệ đó và việc thực thi mã bị gián đoạn.

đầu ra:

$ perl test.pl 
could not unlink files (/something/not/available): No such file or directory 
NO RESULT for test at line 561 of /home/y/lib/perl5/site_perl/5.8/Test/Cmd/Common.pm (Test::Cmd::Common::unlink) 
    from line 9 of test.pl. 

là eval làm công việc ngay tại đây? hoặc tôi hiểu nhầm điều gì đó?

F.

Trả lời

11

Từ tài liệu của Test :: Cmd :: Common: "Loại bỏ các tập tin định Thoát khỏi không có kết quả nếu bất kỳ tập tin không thể được gỡ bỏ vì lý do nào..". Và bằng cách nhìn vào nguồn, Test :: Cmd :: Common gọi Test :: Cmd-> no_result, mà thực sự không

exit (2); 

"exit" có thể không rơi vào bẫy của eval, vì vậy nó được dự kiến ​​hành vi.

+0

chưa được kiểm tra, nhưng làm thế nào về '* Test :: Cmd :: no_result = sub { chết 'Không có kết quả'} '? – jrockway

1

này là hơi trực giao, nhưng nếu bạn muốn kiểm tra nếu một hoạt động "thành công" hay chết, sử dụng Test::Exception:

use strict; 
use warnings; 
use Test::More tests => 2; 
use Test::Exception; 

note 'File system operations'; 
dies_ok 
    { some_operation_which_may_die(); } 
    'operation died'; 

throws_ok 
    { some_operation_which_may_die(); } 
    /String we expect to see on death/, 
    'operation died with expected message'; 
Các vấn đề liên quan