2013-03-24 4 views
12

Ho un comando in una clausola try che so genera un'eccezione. Sto provando a prenderlo in una clausola "except", ma la clausola except sembra non riconoscere l'esistenza dell'eccezione. L'eccezione, quando non gestita (cioè non racchiusa in una clausola try), si presenta così nella finestra interattiva:eccezione python non riconosciuta; come gestire con tranne?

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 

Il quando ho messo il comando in un try/tranne la costruzione nel primo file in tale elenco, "actions.py", in questo modo:

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

mi aspetterei che la clausola di cui sopra sarebbe prendere il "HTTPError: HTTP Error 500: Internal Server Error" viene riprodotto quando si esegue la funzione ncbo_annotate, ma invece quando ho eseguire quanto sopra, ricevo un errore che dice che il nome globale "HTTPError" non è definito:

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 

Quindi qual è l'affare? Ho pensato che Python solleva l'eccezione finché non trova un gestore all'interno di una clausola try o lo sputa non gestito. Perché il mio codice non ha idea di cosa sia un errore HTTPError o, in alternativa, come faccio a sapere cosa è in grado di gestirlo?

risposta

19

Probabilmente devi solo importare la classe HTTPError prima di usarla. Provare a inserire nella parte superiore del file actions.py:

from urllib2 import HTTPError 

e quindi si dovrebbe essere in grado di utilizzare il codice come è.

+2

Un'altra cosa che puoi fare è mettere prima HTTPError suo namespace, scrivendo la clausola except in questo modo: 'tranne urllib2.HTTPError:' – gerlos

10

è necessario controllare per urllib2.HTTPError:

except urllib2.HTTPError: 
1

@ soluzione di Emily va bene, ma c'è un altro modo per risolvere questo problema senza importare quella classe.

Hai solo bisogno di dare spazio nome completo della classe di eccezione che si desidera catturare:

except urllib2.HTTPError: 

In questo modo è necessario un minor numero di import clausole nel codice, ed è più facile per voi per dire poi che il modulo ha sollevato l'eccezione.

4

In Python 3 è:

from urllib.error import HTTPError