如何抓住';recv超时';Perl MongoDB::Cursor的错误?

如何抓住';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

我有一个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/MongoDB/Cursor.pm line 251.
我已采取以下步骤来缓解:
  • 在$collection->find(…)周围的eval块
  • 在$cursor->next()周围评估块
  • 连接查询超时值60000
  • 连接超时1000

    超时并不奇怪,因为服务器处于高负载下。但我想巧妙地捕捉超时并优雅地退出

    有什么建议吗

    更新:

    我已经确定recv超时肯定发生在$cursor->next()调用上

    # 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" };