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

在 Python 3 中是:

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

您可能只需要HTTPError在使用之前导入该类。尝试在您的 actions.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 回答