我正在尝试捕获与Python的套接字连接中的错误。我需要使用两种不同类型的错误 [ConnectionRefusedError,OSError] 。我想对每个错误执行不同的操作,所以我用(尝试除外)语句进行了处理,并且当代码类似于下面所示的 [首先写入哪个(OSError)异常] 时,即使出现错误(ConnectionRefusedError),也会引发第一个异常 [哪个是(OSError)]
代码:
for ip in ips:
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try :
sock.connect((ip,12345))
print("Up.")
up.append(ip)
sock.close()
except OSError:
print("Down.")
raise
except ConnectionRefusedError:
print("Up.")
up.append(ip)
except Exception as e:
print(e)
- 输出:关闭。
- 引发的错误:ConnectionRefusedError:[Errno 111]连接被拒绝
因此[OSError]异常具有raise
语句引发了[ConnectionRefusedError](哪个是下一个异常语句!)。
。但是,当我首先交换异常并写入(ConnectionRefusedError)时,它工作正常:
for ip in ips:
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try :
sock.connect((ip,port))
print("Up.")
sock.close()
except ConnectionRefusedError:
print("Up.")
up.append(ip)
except OSError:
print("Down.")
raise
except Exception as e:
print(e)
那么,为什么OSError异常会在第一种情况下处理ConnectionRefusedError? 并且有一种方法可以先编写OSError异常并立即生效?
答案 0 :(得分:0)
ConnectionRefusedError
继承自OSError
,所以接受except
的{{1}}子句可以与OSError
匹配;特别是,假设ConnectionRefusedError
子句按其写入的顺序进行测试,如果首先写入except
子句,它将始终与OSError
异常匹配。
没有办法解决这个 1 ,因此作为一般规则,您总是要在更通用的异常处理程序之前编写更具体的异常处理程序。