我有一堆通过网络进行不同操作的课程,众所周知,网络操作有时会超时。所以我想做这样的事情:
package My::Role::NetworkFetcher {
use Moose::Role;
sub BUILD {
my $self = shift;
local $SIG{ALRM} = sub {
$self->handle_timeout;
};
alarm 60;
}
sub handle_timeout {
die "default timeout handler";
}
}
我不确定这是否是解决此问题的最佳方法。 似乎在我非常简单的测试用例中正常工作,但我不确定是否劫持对象的BUILD
方法或以这种方式本地化信号处理程序是正确的,甚至是可取的。
答案 0 :(得分:2)
在这里小心。 本地$ SIG {ALRM} 仅适用于BUILD方法,因此如果您在不调用警报0 的情况下离开函数范围,则默认的ALRM处理程序如果您离开BUILD方法并且发生超时,则会发生。在eval中完成整个事情是最安全的,这样你就不会遇到模糊的问题。