Почему я получаю AttributeError при попытке распечатать - PullRequest
12 голосов
/ 26 сентября 2011

Я узнал о urllib2, следуя этому уроку http://docs.python.org/howto/urllib2.html#urlerror Запуск приведенного ниже кода дает другой результат из урока

import urllib2

req = urllib2.Request('http://www.pretend-o-server.org')
try:
    urllib2.urlopen(req)
except urllib2.URLError, e:
    print e.reason

Интерпретатор Python выплевывает это обратно

Traceback (most recent call last):
  File "urlerror.py", line 8, in <module>
    print e.reason
AttributeError: 'HTTPError' object has no attribute 'reason'

Как это происходит?

ОБНОВЛЕНИЕ

Когда я пытаюсь распечатать атрибут кода, он работает нормально

import urllib2

req = urllib2.Request('http://www.pretend-o-server.org')
try:
    urllib2.urlopen(req)
except urllib2.URLError, e:
    print e.code

Ответы [ 3 ]

8 голосов
/ 26 сентября 2011

В зависимости от типа ошибки объект e может нести или не содержать этот атрибут.

В приведенной вами ссылке есть более полный пример:

номер 2

from urllib2 import Request, urlopen, URLError
req = Request(someurl)
try:
    response = urlopen(req)
except URLError, e:
    if hasattr(e, 'reason'): # <--
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason
    elif hasattr(e, 'code'): # <--
        print 'The server couldn\'t fulfill the request.'
        print 'Error code: ', e.code
else:
    # everything is fine
4 голосов
/ 26 сентября 2011

Потому что нет такого атрибута. Попробуйте:

print str(e)

и вы получите приятное:

HTTP Error 404: Not Found
1 голос
/ 27 сентября 2011

Причина, по которой я получил AttributeError, была в том, что я использовал OpenDNS.Очевидно, даже когда вы передаете поддельный URL, OpenDNS обрабатывает его так, как будто он существует.Поэтому после переключения на DNS-сервер Googles я получаю ожидаемый результат:

[Errno -2] Name or service not known

Также я должен упомянуть трассировку, полученную мной для запуска этого кода, которая включает все, кроме try и кроме

from urllib2 import Request, urlopen, URLError, HTTPError

req = Request('http://www.pretend_server.com')
    urlopen(req)

это

Traceback (most recent call last):
  File "urlerror.py", line 5, in <module>
    urlopen(req)
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 397, in open
    response = meth(req, response)
  File "/usr/lib/python2.6/urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.6/urllib2.py", line 435, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found

какой добрый нежный (горе) человек?из IRC #python сказал мне, что это очень странно, а затем спросил, использую ли я OpenDNS, на что я ответил да.Поэтому они предложили мне перейти на Google, что я и начал делать.

...