名称错误:全局名称'HTTPError'未定义

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是什么,或者说,我该如何告诉它HTTPError是什么以便能够处理它呢?

6个回答

42

在Python 3中,它是这样的:

from urllib.error import HTTPError

3
иҷҪ然дёҠиҝ°ж–№жі•жӣҙеҘҪпјҢдҪҶжҳҜеҰӮжһңдҪ жғіеҮҸе°‘еҜје…Ҙзҡ„жЁЎеқ—ж•°йҮҸ并且已з»ҸеҜје…ҘдәҶrequestжЁЎеқ—пјҢиҝҷдёӘж–№жі•д№ҹеҸҜд»ҘеңЁurllib.requestдёӯжүҫеҲ°гҖӮ - Max Candocia

26
你可能只需要在使用之前导入HTTPError类。请尝试在你的actions.py文件顶部插入以下代码:
from urllib2 import HTTPError

然后你应该能够像现在这样使用你的代码。


2
你可以做的另一件事是在HTTPError之前加上它的命名空间,将except子句写成这样:except urllib2.HTTPError: - gerlos

9

您需要检查urllib2.HTTPError:

except urllib2.HTTPError:

1

@Emily的解决方案不错,但是还有另一种方法可以解决这个问题,而不需要导入那个类。

你只需要给出要捕获的异常类的完整名称空间即可:

except urllib2.HTTPError:

这样做可以减少代码中需要使用的import语句数量,并且更容易确定引发异常的模块。

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')

0

如果你像我一样非常疲惫和困惑,你可能会犯这个错误:

except HttpError:
    #something

应该是:

except HTTPError:
    #something

所以HTTP应该大写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接