python - (OSError) 异常处理 (ConnectionRefusedError) 错误
问题描述
我正在尝试使用 Python 捕获套接字连接中的错误。我需要处理两种不同类型的错误[ConnectionRefusedError, OSError]。我想对每个错误执行不同的操作,所以我用 (try except) 语句做到了,当代码如下图所示[首先编写哪个 (OSError) 异常]时,只有第一个异常[哪个是 ( OSError)]被引发,即使错误是 (ConnectionRefusedError)
代码:
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] 连接被拒绝
因此,引发了raise
语句 [ConnectionRefusedError] 的 [OSError] 异常(这是下一个异常语句!)。
. 但是当我首先交换异常并写入 (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 异常并立即工作?
解决方案
ConnectionRefusedError
继承自OSError
,因此except
接受 an 的子句OSError
可以匹配 aConnectionRefusedError
就好了;特别是,考虑到except
子句按照编写顺序进行测试,如果OSError
先编写子句,它将ConnectionRefusedError
始终匹配异常。
没有办法绕过这个1,因此作为一般规则,您总是希望在更通用的异常处理程序之前编写更具体的异常处理程序。
- 为了在一般情况下“解决”这个问题,解释器必须根据异常子句的继承关系对子句进行拓扑排序,可能拆分指定多个异常的子句,并且考虑到语言的动态特性,执行这在运行时,减慢了很少重要的功能的异常。
推荐阅读
- java - 爪哇 | 将数据处理程序写入文件的方法花费的时间比预期的要长
- python-3.x - 无法在列表中搜索列表中的记录
- vue.js - Vue中如何实现右键菜单的导航动作?
- vuejs2 - VueJS 将输入绑定到日期值
- angular - 网站和管理面板的文件结构
- javascript - NodeJS|Cluster:如何处理消息传递的对象?
- google-app-engine - 无法运行 google app engine、maven 和 java 入门
- mysql - Laravel doesnthave() 生成一个查询,不会转义 \
- javascript - NonErrorEmittedError:用 v-for 渲染的组件列表应该有明确的键
- angular - 如何使用不同的值而不是 id