NameError: el nombre global ‘HTTPError’ no está definido

Tengo un comando en una cláusula de prueba que sé que produce una excepción. Estoy intentando atraparlo en una cláusula “excepto”, pero la cláusula excepto parece no reconocer la existencia de la excepción. La excepción, cuando no se maneja (es decir, no está incluida en una cláusula de prueba), se ve así en la ventana interactiva:

Traceback (most recent call last): File "", line 1, in  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 

El cuando puse el comando en un try / except construyo en el primer archivo de esa lista, “actions.py”, como este:

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

Espero que la cláusula anterior detecte el “HTTPError: HTTP Error 500: Error interno del servidor” que se produce cuando ejecuto la función ncbo_annotate, pero cuando ejecuto lo anterior, aparece un error que dice que el nombre global “HTTPError” es no definida:

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

Entonces, ¿cuál es el problema? Pensé que Python plantea la excepción hasta que encuentra un manejador dentro de una cláusula de prueba o lo escupe sin ser manejado. ¿Por qué mi código no tiene idea de lo que es un error HTTP, o, alternativamente, cómo le digo qué es para que pueda manejarlo?

Probablemente solo necesite importar la clase HTTPError antes de usarla. Intente insertarlo en la parte superior de su archivo actions.py:

 from urllib2 import HTTPError 

y entonces deberías poder usar tu código tal como está.

En Python 3 es:

 from urllib.error import HTTPError 

Debe comprobar si hay urllib2.HTTPError:

 except urllib2.HTTPError: 

La solución de @ Emily está bien, pero hay otra manera de resolver este problema sin importar esa clase.

Solo debe proporcionar el espacio de nombre completo de la clase de excepción que desea capturar:

 except urllib2.HTTPError: 

De esta manera, necesitará menos cláusulas de import en su código y le será más fácil decir después qué módulo generó la excepción.