(OSError)异常处理(ConnectionRefusedError)错误

时间:2019-01-06 21:45:22

标签: python python-3.x exception-handling try-except

我正在尝试捕获与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异常并立即生效?

1 个答案:

答案 0 :(得分:0)

ConnectionRefusedError继承自OSError,所以接受except的{​​{1}}子句可以与OSError匹配;特别是,假设ConnectionRefusedError子句按其写入的顺序进行测试,如果首先写入except子句,它将始终与OSError异常匹配。

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


  1. 要在一般情况下“解决”此问题,解释器将必须根据继承关系对例外子句进行拓扑排序,这些子句可能会拆分指定多个例外的子句,并且考虑到子句的动态性质,语言,请在运行时执行此操作,以减慢该功能的重要性。