理解Python中的错误代码及其有意义的错误名称

5 投票
3 回答
1639 浏览
提问于 2025-04-17 07:03

我了解Python中处理错误的基本语法,比如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

如果socket出现超时错误,这个错误会被捕获。那么如果我想找一个连接被拒绝的错误呢?我知道这个错误的编号是10061。请问在文档中我应该去哪里找一个像“超时”这样的有意义的名称?对于其他Python模块,也有类似的地方可以查找吗?我知道这个问题有点基础,但我在我的代码中添加错误处理已经有一段时间了,却不知道去哪里找错误的描述和名称。

编辑:

感谢大家的回复。

那么

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

会和

except socket.timeout:
    pass

达到相同的效果吗?

3 个回答

0

根据socket的说明,socket.error的错误值是在errno模块中定义的。

2

你会遇到一个错误,错误代码会用一个叫errno的编号表示,具体的说明可以在errno的文档里找到。错误代码10061只适用于WinSock这个网络库。

5

要实现你想要的功能,你需要捕捉到抛出的异常,提取出里面存储的错误代码,然后进行一些 if 比较,看看这些错误代码和 errno 代码 是否匹配:

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

使用:

def manage_connection_refused():
   print "Connection refused"

def manage_host_down():
   print "Host down"

def default_behaviour():
   print "error"

撰写回答