Исключение python не распознано; как обращаться с исключением?

У меня есть команда в предложении try, которое, как я знаю, вызывает исключение. Я пытаюсь поймать его в "исключении", но предложение except, похоже, не признает существование исключения. Исключение, когда необработанный (т.е. Не заключенный в предложение try), выглядит так в интерактивном окне:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\Andy\software\Turkeys\actions.py", line 234, in annotate
    annotation=annotator.ncbo_annotate(thing)
  File "C:\Users\Andy\software\Turkeys\annotator.py", line 49, in ncbo_annotate
    fh = urllib2.urlopen(submitUrl, postData)
  File "C:\32Python27\lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\32Python27\lib\urllib2.py", line 406, in open
    response = meth(req, response)
  File "C:\32Python27\lib\urllib2.py", line 519, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\32Python27\lib\urllib2.py", line 444, in error
    return self._call_chain(*args)
  File "C:\32Python27\lib\urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "C:\32Python27\lib\urllib2.py", line 527, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 500: Internal Server Error

Когда я помещаю команду в конструкцию try/except в первый файл в этом списке, "actions.py", например:

try:
    annotation=annotator.ncbo_annotate(thing)
except HTTPError: 
    ...do some things with this 

Я бы ожидал, что в приведенном выше предложении будет обнаружена ошибка HTTPError: Ошибка HTTP 500: Внутренняя ошибка сервера, возникающая при запуске функции ncbo_annotate, но вместо этого, когда я запускаю выше, я получаю сообщение об ошибке "Глобальное имя", HTTPError "не определен:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\Andy\software\Turkeys\actions.py", line 235, in annotate
    except HTTPError:
NameError: global name 'HTTPError' is not defined

Так что же сделка? Я думал, что python вызывает исключение, пока не найдет обработчик в предложении try или не выплюнул его необработанным. Почему мой код не знает, что такое HTTPError, или, как альтернатива, как я могу сказать, что это такое, чтобы он мог справиться с этим?

Ответ 1

Вам, вероятно, просто нужно импортировать класс HTTPError перед его использованием. Попробуйте вставить вверху вашего файла actions.py:

from urllib2 import HTTPError

а затем вы сможете использовать свой код как есть.

Ответ 2

Вам нужно проверить urlib2.HTTPError:

except urllib2.HTTPError:

Ответ 3

В Python 3 это:

from urllib.error import HTTPError

Ответ 4

Решение

@Emily в порядке, но есть другой способ решить эту проблему без импорта этого класса.

Вам просто нужно указать полное пространство имен класса исключений, которое вы хотите поймать:

except urllib2.HTTPError:

Таким образом вам нужно меньше import предложений в вашем коде, и вам будет легче рассказать потом, какой модуль вызвал исключение.