我使用LWP下載從網頁上的內容,我想限制的時間等待一個頁面的數量。這是在LWP完成這樣的:手柄LWP超時有效
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->get($url);
這工作正常,但每當超時達到其極限時,它只是死了,我無法繼續與腳本!我真的想正確處理這個超時,這樣我就可以記錄這個url有一個超時,然後繼續到下一個。有誰知道如何做到這一點?謝謝!
我使用LWP下載從網頁上的內容,我想限制的時間等待一個頁面的數量。這是在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 [email protected]
解決了一些問題(請參閱Try::Tiny
文檔中的背景部分)。
對於大多數目的而言,LWP :: UserAgent的超時已足夠,但確實存在一些缺陷......它適用於每個系統調用的,而不是它們的聚合。如果你真的需要一個固定的超時時間,這是LWPx::ParanoidAgent需要注意的事情之一。
非常感謝!這非常有用。我測試了它,但由於某種原因,即使發生超時,它也不會在第二條語句中進入。 「讀取超時」是$ response->消息中的內容。你知道爲什麼第二次陳述沒有測試爲真嗎? – srchulo
不確定。你使用HTTP :: Status嗎? '$ response-> message'和'$ response-> code'的實際值是多少?它是一個實際的超時(代碼408)? – stevenl
我完全按照「HTTP :: Status :: HTTP_REQUEST_TIMEOUT」之上的方式使用了代碼。 $ response->消息保存「讀取超時」,$ response->代碼保存「500」。 – srchulo