global variable python




NameError:グローバル名 'HTTPError'は定義されていません (3)

私は例外を投げることを私が知っているtry節にコマンドがあります。 私はそれを "except"節で捉えようとしていますが、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

このリストの最初のファイル「actions.py」のtry / exceptコンストラクトにコマンドを追加すると、次のようになります。

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

ncbo_annotate関数を実行すると、上記の句で "HTTPError:HTTP Error 500:Internal Server Error"が生成されることが予想されますが、代わりに上記のコマンドを実行すると、グローバル名 "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が何であるのかわからないのですか、それとも、どうやってそれを処理できるようにするのですか?


@ Emilyの解決策は問題ありませんが、そのクラスをインポートせずにこの問題を解決する別の方法があります。

捕捉したい例外クラスのフルネームスペースを指定するだけです。

except urllib2.HTTPError:

こうすれば、コード内のimport句が少なくて済み、どのモジュールで例外が発生したのかを後で確認するのが簡単になります。


Python 3では、

from urllib.error import HTTPError

あなたはそれを使う前にHTTPErrorクラスをインポートする必要があるでしょう。 actions.pyファイルの先頭に挿入してみます。

from urllib2 import HTTPError

そうすれば、あなたは自分のコードをそのまま使用できるはずです。





global-variables