我正在使用LWP从网页下载内容,并希望限制它等待页面的时间。在LWP中,可以通过以下方式实现:
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->get($url);
这个方法看起来不错,但问题在于当超时时间到达限制后,程序就会崩溃,我无法继续执行脚本!我希望能正确处理超时情况,记录下该URL存在超时问题并继续执行脚本。有没有人知道怎么做?谢谢!
我正在使用LWP从网页下载内容,并希望限制它等待页面的时间。在LWP中,可以通过以下方式实现:
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->get($url);
这个方法看起来不错,但问题在于当超时时间到达限制后,程序就会崩溃,我无法继续执行脚本!我希望能正确处理超时情况,记录下该URL存在超时问题并继续执行脚本。有没有人知道怎么做?谢谢!
LWP::Agent 的 get()
方法返回一个 HTTP::Response 对象,您可以使用它来检查错误:
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) {
...
}
}
顺便提一句,现在更好的做法是使用Try::Tiny而不是eval {...}
。它可以为您提供try {...} catch {...}
,并解决了一些检查if $@
时的问题(请参见Try::Tiny
文档中的背景部分)。
对于大多数情况,LWP::UserAgent的超时时间是足够的,但它会遇到一些缺点...它适用于每个系统调用,而不是它们的总体。如果您确实需要固定的超时时间,这就是LWPx::ParanoidAgent处理的其中之一。
HTTP::Status
?$response->message
和$response->code
的实际值是什么?这是一个实际的超时(代码408)吗? - stevenl