python - python 异常包含的 errnos 是否与 "linux/errno.h"中的 errnos 相同?

标签 python linux sockets exception error-handling

据我所知,python的异常返回的errnos大部分与“linux/errno.h”中的errnos相同。但有时,事情并不像我期望的那样:

例如,当一个socket连接抛出一个socket.timeout异常时,它返回的errno应该是110,然而它的errno总是None:

try:
    address = ('8.8.8.8', 12345)  
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.settimeout(1)
    s.connect(address)  
except EnvironmentError as e:
    print e.errno      # None
    print e.strerror   # "time out"

其次,当抛出地址相关的异常时,errno会是负数,但linux/errno.h中的errnos在1到133之间:

try:
    address = ('xxxxxxx', 12345)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(address)
except socket.gaierror, v:
    print v[0]     # -5

在这种情况下,将打印 -5。

我对所有这些错误感到很困惑。 :(

最佳答案

只有 OSError 和 IOError 带有 errno 值。 socket.gaierror 将返回一个 getaddrinfo(3) 错误代码。其他异常通常只是携带字符串。代码在套接字模块中。 -5 是 socket.EAI_NODATA,表示“指定的网络主机存在,但没有定义任何网络地址”。

关于python - python 异常包含的 errnos 是否与 "linux/errno.h"中的 errnos 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550379/

相关文章:

python - Django:模板中的变量是个好主意吗?

linux - EPOLLONESHOT 是否阻止在对 epoll_wait() 的单个调用中返回单个描述符上的多个事件?

python - Discord Bot 未激活

python - Python 文本中显示的大括号

linux - 在 Linux 上,如何使用 POSIX shell 禁用鼠标一秒钟,而不是等待第二个并立即做一些工作?

c# - 将 Windows 文件格式转换为 Linux 格式

java - 如何在 Java 中获取计算机的 WAN IP 地址?

java - MulticastSocket 中 joinGroup() 的用途

python - 在 Python 的 ip 接口(interface)上捕获数据包

c++ - 在 Windows 中为 python 编译 SWIG 包装器