2017-04-04 7 views
6

This try połowy wyjątkiem:Dlaczego Perl 6 nie próbuje obsłużyć niezerowego wyjścia w powłoce()?

try die X::AdHoc; 
say "Got to the end"; 

Wyjście pokazuje, że program kontynuuje:

Got to the end 

Jeśli próbuję ją shell i polecenia, które nie wyjście z 0, spróbuj robi „t go złapać:

try shell('/usr/bin/false'); 
say "Got to the end"; 

wyjście nie wygląda wyjątek:

The spawned command '/usr/bin/false' exited unsuccessfully (exit code: 1) 
    in block <unit> at ... line ... 

Co się dzieje, że to sprawia, że ​​przez próbę?

+0

FWIW, to pachnie jak pluskwa. Proszę, zrób to! –

+1

Zajmę się tym. Zakładam też, że jestem pierwszym problemem. :) –

+1

Warto zauważyć Proc obiektu .Bool jest fałszywe, gdy wyjście jest niezerowe, więc jednym ze sposobów na sprawdzenie niepowodzenia jest po prostu użycie tego Bool: '" false ". & Shell lub powiedz" tis no good! " ; ' –

Odpowiedz

5

Odpowiedź jest naprawdę pod warunkiem Jonathan Worthington:

https://irclog.perlgeek.de/perl6-dev/2017-04-04#i_14372945 

w skrócie, shell() zwraca obiekt Proc. Gdy obiekt zostanie zatopiony, rzuci wyjątek, który wystąpił wewnętrznie, jeśli uruchomienie programu zakończyło się niepowodzeniem.

$ 6 'dd shell("/usr/bin/false")' 
Proc.new(in => IO::Pipe, out => IO::Pipe, err => IO::Pipe, exitcode => 1, signal => 0, command => ["/usr/bin/false"]) 

Więc co trzeba zrobić, to złapać przedmiot Proc w zmiennej, aby zapobiec jej zatopiony:

$ 6 'my $result = shell("/usr/bin/false"); say "Got to the end"' 
Got to the end 

a następnie można użyć $ result.exitcode aby sprawdzić, czy zakończyło się sukcesem lub nie.

+1

A jeśli chce się eksplozji, można zrobić" spróbuj zmylić powłokę "false'', aby zatopić' Proc' * wewnątrz * "try". –