如何捕获我未完全导入的模块的异常?

时间:2012-11-16 08:54:46

标签: python exception try-catch

通常情况下,如果我导入socket,我就可以轻松捕获异常:

>>> import socket
>>> try:
...     socket.gethostbyname('hello')
... except socket.gaierror:
...     print('oops')
...
oops

但是,如果我只是导入socket.gethostbyname,它将无效:

>>> from socket import gethostbyname
>>> try:
...     gethostbyname('hello')
... except socket.gaierror:
...     print('oops')
...
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
NameError: name 'socket' is not defined

如果我尝试抓住NameError,我也会获得gaierror

这有什么解决方法吗?是否无法用字符串捕获异常(例如。except 'socket.gaierror':)?

2 个答案:

答案 0 :(得分:19)

如果您不想导入完整模块,您只需导入异常即可。 PEP8声明您可以这样做。

from socket import gethostbyname, gaierror

http://www.python.org/dev/peps/pep-0008/#imports

答案 1 :(得分:5)

在这种情况下,您应该使用:from socket import gethostbyname,gaierror,然后尝试:

except gaierror:
    print('oops')

那是因为from socket import gethostbyname等同于:

import socket
gethostbyname=socket.gethostbyname
del socket

因此socket已从命名空间中删除,您将获得NameError