2010-01-12 1 views
5

Ich habe folgende Perl-Code:Warum fängt Perls eval keine Probleme von 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"; 

Die Test- $> unlink() Linie und werfen Ausnahme fehlschlagen. aber das Problem: eval behandelt diese Ausnahme nicht und die Codeausführung wird unterbrochen.

die Ausgabe:

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

Ist eval hier den richtigen Job zu tun? oder ich verstehe etwas falsch?

F.

Antwort

11

Aus Dokumentation von Test :: Cmd :: Häufig: „Entfernt die angegebenen Dateien Verlässt kein Ergebnis, wenn eine Datei nicht aus irgendeinem Grund entfernt werden könnte..“. Und an der Quelle suchen, Test :: Cmd :: Häufig ruft Test :: Cmd-> no_result, das wirklich tut

exit (2); 

"exit" kann nicht durch eval gefangen werden, so wird das erwartete Verhalten.

+0

Ungeprüfte, aber wie wäre es '* Test :: Cmd :: no_result = sub { sterben 'Kein Ergebnis'} '? – jrockway

1

Dies ist etwas orthogonal, aber wenn Sie testen möchten, ob eine Operation "erfolgreich" oder gestorben ist, verwenden 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';