2012-06-12 45 views
7

我使用LWP下載從網頁上的內容,我想限制的時間等待一個頁面的數量。這是在LWP完成這樣的:手柄LWP超時有效

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

這工作正常,但每當超時達到其極限時,它只是死了,我無法繼續與腳本!我真的想正確處理這個超時,這樣我就可以記錄這個url有一個超時,然後繼續到下一個。有誰知道如何做到這一點?謝謝!

回答

13

LWP::Agentget()返回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 [email protected]解決了一些問題(請參閱Try::Tiny文檔中的背景部分)。

+0

非常感謝!這非常有用。我測試了它,但由於某種原因,即使發生超時,它也不會在第二條語句中進入。 「讀取超時」是$ response->消息中的內容。你知道爲什麼第二次陳述沒有測試爲真嗎? – srchulo

+0

不確定。你使用HTTP :: Status嗎? '$ response-> message'和'$ response-> code'的實際值是多少?它是一個實際的超時(代碼408)? – stevenl

+0

我完全按照「HTTP :: Status :: HTTP_REQUEST_TIMEOUT」之上的方式使用了代碼。 $ response->消息保存「讀取超時」,$ response->代碼保存「500」。 – srchulo

1

對於大多數目的而言,LWP :: UserAgent的超時已足夠,但確實存在一些缺陷......它適用於每個系統調用的,而不是它們的聚合。如果你真的需要一個固定的超時時間,這是LWPx::ParanoidAgent需要注意的事情之一。