我有以下代码:
try:
connSock = socket(AF_INET, SOCK_STREAM)
connSock.connect((tgtHost, tgtPort))
except:
pass
finally:
connSock.close()
Pycharm说:
在connSock.close()行上赋值之前,可能会引用局部变量'connSock'
这怎么可能?
我错过了什么吗?
更新:
如果您的操作系统用完描述符,socket()函数可能会引发异常
答案 0 :(得分:7)
如果第二行上的socket()
调用引发异常,则connSock
永远不会被绑定。
套接字可以用作上下文管理器,使用它有利于您:
try:
with socket(AF_INET, SOCK_STREAM) as connSock:
connSock.connect((tgtHost, tgtPort))
except socket.error:
pass
在退出with
块时关闭套接字,而不必引用它,并且仅当socket()
调用实际成功时才会关闭套接字。
请注意,很少使用毯子except: pass
。更好地捕捉特定的例外。
答案 1 :(得分:3)
socket(AF_INET, SOCK_STREAM)
可能会抛出异常,因此永远不会分配connSock
。然后,connSock.close()
无法工作。
答案 2 :(得分:1)
如果try
块引发错误(特别是在第一行connSock = socket(AF_INET, SOCK_STREAM)
),则在connSock
块执行时不会定义finally
。