18

例外をスローすることがわかっている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が何であるかを知らないのですか、あるいは、それを処理できるようにそれが何であるかをどのように伝えるのですか?

4

6 に答える 6

37

Python3では次のようになります。

from urllib.error import HTTPError
于 2015-07-28T08:28:39.237 に答える
26

HTTPErrorおそらく、使用する前にクラスをインポートする必要があります。アクション.pyファイルの先頭に挿入してみてください。

from urllib2 import HTTPError

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

于 2013-03-24T16:04:52.010 に答える
9

urllib2.HTTPErrorを確認する必要があります。

except urllib2.HTTPError:
于 2013-03-24T16:06:09.210 に答える
1

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

キャッチしたい例外クラスのフルネームスペースを指定する必要があります。

except urllib2.HTTPError:

このようにすると、コードに必要なimport句が少なくなり、後でどのモジュールが例外を発生させたかを簡単に判断できます。

于 2014-08-04T17:15:51.603 に答える
0

Python 3では、次のようにする必要があります。

from urllib.request import urlopen, HTTPError
try:
    html = urlopen('http://www.test.com')
except HTTPError as e:
    print(e)
else:
    print('its ok')
于 2021-01-17T15:55:59.793 に答える
0

あなたが私のように非常に疲れていて混乱しているなら、あなたの間違いは次のように呼んでいるかもしれません:

except HttpError:
    #something

そのはず:

except HTTPError:
    #something

したがって、HTTPは大文字にする必要があります。

于 2021-11-10T21:55:54.490 に答える