Почему я получаю AttributeError при попытке распечатать
я узнаю о 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 ответов
в зависимости от типа ошибки, объект 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
потому что такого атрибута нет. Попробуйте:
print str(e)
и вы получите хороший:
HTTP Error 404: Not Found
причина, по которой я получил AttributeError, заключалась в том, что я использовал OpenDNS. По-видимому, даже когда вы передаете поддельный URL, OpenDNS рассматривает его как существующий. Поэтому после перехода на DNS-сервер Googles я получаю ожидаемый результат:
[Errno -2] Name or service not known
также я должен упомянуть traceback, который я получил для запуска этого кода, который является всем, кроме try and except
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
какой добрый нежный (wo)человек? из IRC #python сказал мне было очень странно, а затем спросил, использую ли я OpenDNS, на который я ответил "Да". Поэтому они предложили мне переключить его на Google, что я и сделал.