在此代码中赋值之前引用的变量

时间:2014-08-14 18:25:39

标签: python

我有以下代码:

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

Pycharm说:

  

在connSock.close()行上赋值之前,可能会引用局部变量'connSock'

这怎么可能?

我错过了什么吗?


更新:

如果您的操作系统用完描述符

socket()函数可能会引发异常

3 个答案:

答案 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