Как отличить ошибку тайм-аута и другие `URLError` в Python? - PullRequest
5 голосов
/ 29 марта 2011

Как различить ошибку тайм-аута и другие URLError с в Python?

EDIT

Когда я ловлю URLError, это может быть Temporary failure in name resolution или timeout, или какая-то другая ошибка? Как я могу отличить одно от другого?

Ответы [ 2 ]

5 голосов
/ 29 марта 2011

Я использую код, подобный варианту 2, ниже ... но для исчерпывающего ответа посмотрите на страницу urllib2 Майкла Фурда

Если вы используете либо опцию 1, либо опцию 2 ниже, вы можете добавить столько разума и ветвления, сколько захотите в пунктах кроме, взглянув на e.code или e.reason

Вариант 1:

from urllib2 import Request, urlopen, URLError, HTTPError
req = Request(someurl)
try:
    response = urlopen(req)
except HTTPError, e:
    print 'The server couldn\'t fulfill the request.'
    print 'Error code: ', e.code
except URLError, e:
    print 'We failed to reach a server.'
    print 'Reason: ', e.reason
else:
    # everything is fine

Вариант 2:

from urllib import urlencode
from urllib2 import Request
# insert other code here...
    error = False
    error_code = ""
    try:
        if method.upper()=="GET":
            response = urlopen(req)
        elif method.upper()=="POST":
            response = urlopen(req,data)
    except IOError, e:
        if hasattr(e, 'reason'):
            #print 'We failed to reach a server.'
            #print 'Reason: ', e.reason
            error = True
            error_code = e.reason
        elif hasattr(e, 'code'):
            #print 'The server couldn\'t fulfill the request.'
            #print 'Error code: ', e.code
            error = True
            error_code = e.code
    else:
        # info is dictionary of server parameters, such as 'content-type', etc...
        info = response.info().dict
        page = response.read()
0 голосов
/ 08 октября 2014

Я использую следующий код для разграничения ошибки тайм-аута и других URLError

except URLError, e:
    if e.reason.message == 'timed out':
        # handle timed out exception
    else:
        # other URLError
...