sid*_*com 5 perl eval try-catch
为什么不使用try/catch的子程序给出与eval-version相同的结果?
#!/usr/bin/env perl
use warnings; use strict;
use 5.012;
use Try::Tiny;
sub shell_command_1 {
my $command = shift;
my $timeout_alarm = shift;
my @array;
eval {
local $SIG{ALRM} = sub { die "timeout '$command'\n" };
alarm $timeout_alarm;
@array = qx( $command );
alarm 0;
};
die $@ if $@ && $@ ne "timeout '$command'\n";
warn $@ if $@ && $@ eq "timeout '$command'\n";
return @array;
}
shell_command_1( 'sleep 4', 3 );
say "Test_1";
sub shell_command_2 {
my $command = shift;
my $timeout_alarm = shift;
my @array;
try {
local $SIG{ALRM} = sub { die "timeout '$command'\n" };
alarm $timeout_alarm;
@array = qx( $command );
alarm 0;
}
catch {
die $_ if $_ ne "timeout '$command'\n";
warn $_ if $_ eq "timeout '$command'\n";
}
return @array;
}
shell_command_2( 'sleep 4', 3 );
say "Test_2"
Run Code Online (Sandbox Code Playgroud)
dao*_*oad 12
你错过了try/catch块的最后一个分号.
你有:
try {
...
}
catch {
...
}
return;
Run Code Online (Sandbox Code Playgroud)
所以,你有相同的代码: try( CODEREF, catch( CODEREF, return ) );
更新:
我忘了提,修改你的代码只需改变shell_command_2:
sub shell_command_2 {
my $command = shift;
my $timeout_alarm = shift;
my @array;
try {
local $SIG{ALRM} = sub { die "timeout '$command'\n" };
alarm $timeout_alarm;
@array = qx( $command );
alarm 0;
}
catch {
die $_ if $_ ne "timeout '$command'\n";
warn $_ if $_ eq "timeout '$command'\n";
}; # <----- Added ; here <======= <======= <======= <=======
return @array;
}
Run Code Online (Sandbox Code Playgroud)