Почему Perl не отлавливает проблемы с eval из Test :: Cmd :: Common-> unlink? - PullRequest
5 голосов
/ 12 января 2010

У меня есть следующий код Perl:

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(!$@, "file unlike");

print "done.\n";

Строка $ test-> unlink () завершится ошибкой и выдаст исключение. но проблема: eval не обрабатывает это исключение, и выполнение кода прерывается.

выход:

$ 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.

eval делает правильную работу здесь? или я что-то недопонимаю?

F.

Ответы [ 2 ]

11 голосов
/ 12 января 2010

Из документации Test :: Cmd :: Common: «Удаляет указанные файлы. Выход из NO RESULT, если какой-либо файл не может быть удален по любой причине.». И, посмотрев на источник, Test :: Cmd :: Common вызывает Test :: Cmd-> no_result, что действительно

exit (2);

"выход" не может быть перехвачен eval, поэтому это ожидаемое поведение.

1 голос
/ 12 января 2010

Это немного ортогонально, но если вы хотите проверить, «завершилась» ли операция или нет, используйте 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';
...