首页 > 解决方案 > (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 异常并立即工作?

标签: pythonpython-3.xexception-handlingtry-except

解决方案


ConnectionRefusedError继承自OSError,因此except接受 an 的子句OSError可以匹配 aConnectionRefusedError就好了;特别是,考虑到except子句按照编写顺序进行测试,如果OSError先编写子句,它将ConnectionRefusedError始终匹配异常。

没有办法绕过这个1,因此作为一般规则,您总是希望在更通用的异常处理程序之前编写更具体的异常处理程序。


  1. 为了在一般情况下“解决”这个问题,解释器必须根据异常子句的继承关系对子句进行拓扑排序,可能拆分指定多个异常的子句,并且考虑到语言的动态特性,执行这在运行时,减慢了很少重要的功能的异常。

推荐阅读