有效地处理LWP超时(handle lwp timeout effectively)

2019-09-18 00:41发布

我使用的LWP下载从网页上的内容,我想限制的时间等待一个页面的数量。 这是在这样的LWP来实现:

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->get($url);

而这个工作正常,但每当超时达到其极限时,它只是死了,我无法继续与脚本! 我真的很想妥善处理这一超时,这样我可以记录该URL有超时,然后转移到我的下一个。 有谁知道如何做到这一点? 谢谢!

Answer 1:

LWP ::代理的get()返回一个HTTP响应::您可以用于检查错误的对象:

use LWP::Agent;
use HTTP::Status ();

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
my $response = $ua->get($url);

if ($response->is_error) {
    printf "[%d] %s\n", $response->code, $response->message;

    # record the timeout
    if ($response->code == HTTP::Status::HTTP_REQUEST_TIMEOUT) {
        ...
    }
}

顺便说一句,在更好的做法是时下使用尝试::微小代替eval {...} 它可以让你try {...} catch {...} 它解决了与检查的一些问题if $@ (见背景部分Try::Tiny文档)。



Answer 2:

你可以使用eval块一个尝试{}赶上{}在Perl相当于:

http://perldoc.perl.org/functions/eval.html



Answer 3:

在大多数情况下,LWP :: UserAgent的的超时时间是足够的,但它确实一些缺点...它适用于每个系统调用,而不是他们的总和。 如果你真的需要一个固定的超时时间,这是说的事情之一LWPx :: ParanoidAgent照顾了。



文章来源: handle lwp timeout effectively