NameError:全局名称 'HTTPError' 未定义

18 投票
6 回答
35321 浏览
提问于 2025-04-17 20:09

我在一个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一点概念都没有,或者说我该怎么告诉它什么是HTTPError,这样它才能处理这个异常呢?

6 个回答

9

你需要检查一下 urllib2.HTTPError 错误:

except urllib2.HTTPError:
42

在Python 3中是这样的:

from urllib.error import HTTPError
27

你可能只需要在使用之前先导入一下HTTPError这个类。试着在你的actions.py文件的最上面加上:

from urllib2 import HTTPError

这样你就可以照常使用你的代码了。

撰写回答