如何在 Windows 10 上使用 IPC::Run 捕获超时异常?
How to catch timeout exception with IPC::Run on Windows 10?
我正在尝试在 Windows 10 上使用 IPC::Run 捕获超时异常(使用 Strawberry Perl 版本 5.30.1):
use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);
my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 5; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;
eval {
$result = run $cmd, $in, $out, $err, timeout($timeout );
};
if ( $@ ) {
say "Timed out: $@";
}
else {
print Dumper({ out => $out, err => $err});
}
以上程序在 3 秒后终止:
Terminating on signal SIGBREAK(21)
如何捕捉 Perl 脚本中的超时异常?
另请参阅 this 问题。
感谢@zdim!您需要为 BREAK
信号安装信号处理程序。以下作品:
use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);
my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 4; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;
{
local $SIG{BREAK} = sub { die "Got timeout signal" };
eval {
$result = run $cmd, $in, $out, $err, timeout($timeout );
};
}
if ( $@ ) {
say "Timed out: $@";
}
else {
print Dumper({ out => $out, err => $err});
}
输出:
> perl p.pl
Timed out: Got timeout signal at p.pl line 14.
我正在尝试在 Windows 10 上使用 IPC::Run 捕获超时异常(使用 Strawberry Perl 版本 5.30.1):
use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);
my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 5; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;
eval {
$result = run $cmd, $in, $out, $err, timeout($timeout );
};
if ( $@ ) {
say "Timed out: $@";
}
else {
print Dumper({ out => $out, err => $err});
}
以上程序在 3 秒后终止:
Terminating on signal SIGBREAK(21)
如何捕捉 Perl 脚本中的超时异常?
另请参阅 this 问题。
感谢@zdim!您需要为 BREAK
信号安装信号处理程序。以下作品:
use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);
my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 4; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;
{
local $SIG{BREAK} = sub { die "Got timeout signal" };
eval {
$result = run $cmd, $in, $out, $err, timeout($timeout );
};
}
if ( $@ ) {
say "Timed out: $@";
}
else {
print Dumper({ out => $out, err => $err});
}
输出:
> perl p.pl
Timed out: Got timeout signal at p.pl line 14.