了解Python中的错误代码并使用有意义的错误名称

时间:2011-11-25 14:30:06

标签: python error-handling

我理解pythons错误处理的基本try: except: finally:语法。我不明白的是如何找到合适的错误名称来制作可读代码。

例如:

try:
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.connect((HOST, PORT))
     s.settimeout(60)               
     char = s.recv(1)

except socket.timeout:
    pass

因此,如果套接字引发超时,则会捕获错误。如果我正在寻找连接被拒绝怎么样?我知道错误号是10061.我在文档中的哪个位置找到一个含义的全名,例如timeout。是否有类似的地方寻找其他python模块?我知道这是一个新手问题,但我一直在错误处理我的代码一段时间,而实际上并不知道在哪里查找错误描述和名称。

编辑:

感谢您的所有回复。

except socket.error, exception:
    if exception.errno == ETIMEDOUT:
         pass

获得与

相同的结果
except socket.timeout:
    pass

3 个答案:

答案 0 :(得分:5)

要实现您想要的效果,您必须获取引发的异常,提取存储的错误代码,并对errno codes进行一些if比较:

try:
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.connect((HOST, PORT))
     s.settimeout(60)               
     char = s.recv(1)
except socket.error, exception:
    if exception.errno == errno.ECONNREFUSED:
        # this is a connection refused
    # or in a more pythonic way to handle many errors:
    {
       errno.ECONNREFUSED : manage_connection_refused,
       errno.EHOSTDOWN : manage_host_down,
       #all the errors you want to catch
    }.get(exception.errno, default_behaviour)()
except socket.timeout:
    pass

with:

def manage_connection_refused():
   print "Connection refused"

def manage_host_down():
   print "Host down"

def default_behaviour():
   print "error"

答案 1 :(得分:2)

您将收到errno的错误,errno文档中对此进行了描述。 10061仅对WinSock有效。

答案 2 :(得分:0)

根据socket,socket.error值在errno模块中定义。