代码中变量在赋值前被引用

1 投票
3 回答
893 浏览
提问于 2025-04-18 17:19

我有以下这段代码:

try:
    connSock = socket(AF_INET, SOCK_STREAM)
    connSock.connect((tgtHost, tgtPort))
except:
    pass
finally:
    connSock.close()

PyCharm 提示我:

局部变量 'connSock' 可能在赋值之前就被引用了,这发生在 connSock.close() 这一行

这怎么可能呢?

我是不是漏掉了什么?


更新:

如果你的操作系统没有足够的描述符,socket() 函数可能会抛出异常

3 个回答

1

如果在 try 代码块中出现了错误(特别是在第一行 connSock = socket(AF_INET, SOCK_STREAM)),那么当 finally 代码块执行时,connSock 就不会被定义了。

3

socket(AF_INET, SOCK_STREAM) 这个函数可能会出现错误,这样的话 connSock 就可能不会被赋值。这样一来,connSock.close() 就根本无法正常执行。

8

如果第二行的 socket() 调用出现了错误,那么 connSock 就不会被绑定。

我们可以把套接字(socket)当作上下文管理器来使用,这样可以更方便:

try:
    with socket(AF_INET, SOCK_STREAM) as connSock:
        connSock.connect((tgtHost, tgtPort))
except socket.error:
    pass

这样一来,当你退出 with 代码块时,套接字会自动关闭,不需要你手动去引用它,而且只有在 socket() 调用成功的情况下才会这样做。

需要注意的是,你应该很少使用通用的 except: pass,最好是捕获特定的错误。

撰写回答