2013-03-24 12 views
12

Mam polecenie w klauzuli try, które wiem, rzuca wyjątek. Próbuję go złapać w klauzuli "except", ale klauzula except nie rozpoznaje istnienia wyjątku. Wyjątek, gdy nieobsługiwany (nie znaczy ujęty w klauzuli try), wygląda to w interaktywnym oknie:wyjątek Pythona nie został rozpoznany; jak radzić sobie z wyjątkiem?

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 

When I umieścić polecenie w próbie/z wyjątkiem skonstruować w pierwszym pliku w tym wykazie, „actions.py”, tak:

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

Spodziewam się, że powyższa klauzula by złapać „httpError: błąd HTTP 500: Internal Server Error” produkowane kiedy uruchomić funkcję ncbo_annotate, lecz kiedy uruchom powyższy komunikat, otrzymuję komunikat o błędzie informujący, że nazwa globalna "HTTPError" nie jest zdefiniowana:

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 

Więc jaka jest umowa? Myślałem, że python podnosi wyjątek, dopóki nie znajdzie obsługi w klauzuli try lub wypluje ją nieobsługiwaną. Dlaczego mój kod nie ma pojęcia o tym, czym jest HTTPError, lub, alternatywnie, jak mogę powiedzieć, co to jest, aby mógł sobie z tym poradzić?

Odpowiedz

19

Najprawdopodobniej wystarczy zaimportować klasę HTTPError przed jej użyciem. Spróbuj wstawić u góry pliku actions.py:

from urllib2 import HTTPError 

, a następnie powinieneś być w stanie używać swojego kodu w niezmienionym stanie.

+2

Inną rzeczą, jaką możesz zrobić, to umieścić przed httpError jego nazw, pisanie z wyjątkiem klauzuli w ten sposób: 'wyjątkiem urllib2.HTTPError:' – gerlos

10

Trzeba sprawdzić urllib2.HTTPError:

except urllib2.HTTPError: 
1

@ rozwiązanie Emily jest w porządku, ale nie ma innego sposobu, aby rozwiązać ten problem bez importowania tej klasy.

Wystarczy podać pełną nazwę miejsca klasy wyjątków chcesz złapać:

except urllib2.HTTPError: 

ten sposób potrzeba mniej import klauzule w kodzie, a to łatwiej powiedzieć potem, który moduł podniósł wyjątek.

4

W Pythonie 3 to:

from urllib.error import HTTPError 
Powiązane problemy