3

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

例如,当套接字连接抛出 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。

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

4

1 回答 1

2

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

于 2012-09-23T07:22:06.010 回答