如何抓住';recv超时';Perl MongoDB::Cursor的错误?
我有一个Perl程序通过cron发出以下消息:如何抓住';recv超时';Perl MongoDB::Cursor的错误?,perl,mongodb,Perl,Mongodb,我有一个Perl程序通过cron发出以下消息: recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251. recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251. recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/Mongo
recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251.
recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251.
recv timed out (60000 ms) at /usr/local/lib/perl/5.8.8/MongoDB/Cursor.pm line 251.
我已采取以下步骤来缓解:
# doesn't capture
{
local $SIG{__DIE__} = sub { return; };
$doc_ref = $cursor->next();
};
# doesn't capture
eval { $doc_ref = $cursor->next(); };
它可能是一个退出呼叫,而不是diie,所以它不能被eval捕获。尝试测试::陷阱 主要(但不限于)在测试脚本中使用:基于类固醇的块评估,可配置且可扩展,但默认情况下捕获(Perl)STDOUT、STDERR、警告、异常、可能的退出代码,以及测试代码的盒装块返回值
幸运的是,它是一个
模具
,您可以捕获它。有一次我写了一个+守护程序,它通过这个肮脏的诡计重生来欺骗死亡(邪恶的笑声):
use FindBin qw($Script);
use EV;
$EV::DIED = sub { warn $@; exec $^X, $Script, qw(restart) };
brian d foy在他的文章中描述了一个通用的die
陷阱:
use FindBin qw($Script);
use EV;
$EV::DIED = sub { warn $@; exec $^X, $Script, qw(restart) };
$SIG{__DIE__} = sub { warn "I'm sorry, Dave, I'm afraid I can't do that" };