(OSError) 异常句柄 (ConnectionRefusedError) 错误

(OSError) Exception Handles (ConnectionRefusedError) Error

我正在尝试捕获与 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)
  • Output : Down.
  • Raised Error : ConnectionRefusedError: [Errno 111] Connection refused

因此 [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异常然后立马生效?

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

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


  1. 至"fix"在一般情况下,解释器必须根据异常子句的继承关系对子句进行拓扑排序,可能会拆分指定多个异常的子句,并且,给定语言的动态特性,在运行时执行此操作,从而减缓很少重要的功能的异常。