代码中变量在赋值前被引用
我有以下这段代码:
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
,最好是捕获特定的错误。