2010-04-26 23 views
53

Używam parametru timeout w urlopen urllib2.Czas oczekiwania na urllib2? - Python

urllib2.urlopen('http://www.example.org', timeout=1) 

Jak mogę powiedzieć Pythonowi, że w przypadku przekroczenia limitu czasu niestandardowy błąd powinien zostać podniesiony?


Wszelkie pomysły?

+1

Uwaga: Parametr ['timeout' nie ogranicza ani * całkowitego * czasu połączenia, ani * całkowitego * czasu odczytu (odpowiedzi).] (Http://stackoverflow.com/a/32684677/4279) – jfs

Odpowiedz

87

Istnieje bardzo niewiele przypadków, w których chcesz użyć except:. Spowoduje to oddaje żadnego wyjątek, które mogą być trudne do debugowania, a ona oddaje wyjątki w tym SystemExit i KeyboardInterupt, który może sprawić, że Twój program irytujące używać ..

na samym najprostsza, by złapać urllib2.URLError:

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError, e: 
    raise MyException("There was an error: %r" % e) 

Poniżej należy uchwycić konkretny błąd podniesiony gdy czasy połączeń oUT:

import urllib2 
import socket 

class MyException(Exception): 
    pass 

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError, e: 
    # For Python 2.6 
    if isinstance(e.reason, socket.timeout): 
     raise MyException("There was an error: %r" % e) 
    else: 
     # reraise the original error 
     raise 
except socket.timeout, e: 
    # For Python 2.7 
    raise MyException("There was an error: %r" % e) 
+5

To nie zadziała w Pythonie 2.7, ponieważ URLError nie przechwytuje socket.timeout już nie. –

+0

@TalWeiss thanks, dodano dodatkowy haczyk dla 'socket.timeout' – dbr

+1

Co do Pythona 2.7.5 limity czasu są przechwytywane przez urllib2.URLError. –

15

W Pythonie 2.7.3:

import urllib2 
import socket 

class MyException(Exception): 
    pass 

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError as e: 
    print type(e) #not catch 
except socket.timeout as e: 
    print type(e) #catched 
    raise MyException("There was an error: %r" % e)