【问题标题】:(OSError) Exception Handles (ConnectionRefusedError) Error(OSError) 异常处理 (ConnectionRefusedError) 错误
【发布时间】:2019-06-01 15:16:21
【问题描述】:

我正在尝试使用 Python 捕获套接字连接中的错误。我需要处理两种不同类型的错误 [ ConnectionRefusedError, OSError ]。我想对每个错误执行不同的操作,所以我用 (try except) 语句来做,并且当代码如下所示[首先编写哪个(OSError)异常]时,只有第一个异常 [Which Is (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 语句的 [OSError] 异常 [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 异常并立即生效?

【问题讨论】:

  • 您不应该将英语中的每个单词都大写。它应该看起来像这样。它不应该是这样的。

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


【解决方案1】:

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

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


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

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2012-09-15
    • 2011-04-03
    • 2014-01-08
    • 2014-04-06
    • 2013-12-27
    • 2013-05-30
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多