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

use*_*016 8 python exception try-catch

通常,如果我导入socket,我将能够轻松捕获异常:

>>> import socket
>>> try:
...     socket.gethostbyname('hello')
... except socket.gaierror:
...     print('oops')
...
oops
Run Code Online (Sandbox Code Playgroud)

但是,如果我只是导入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
Run Code Online (Sandbox Code Playgroud)

NameError如果我试图抓住,我也会得到一个gaierror.

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

Tui*_*uim 20

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

from socket import gethostbyname, gaierror
Run Code Online (Sandbox Code Playgroud)

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


Ash*_*ary 5

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

except gaierror:
    print('oops')
Run Code Online (Sandbox Code Playgroud)

那是因为from socket import gethostbyname相当于:

import socket
gethostbyname=socket.gethostbyname
del socket
Run Code Online (Sandbox Code Playgroud)

所以socket从命名空间中删除,你得到了NameError.