小能豆

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

py

我有以下代码:

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

Pycharm 表示:

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

这怎么可能呢?

我是否遗漏了什么?


更新:

如果您的操作系统用完了描述符,socket() 函数可能会引发异常


阅读 7

收藏
2024-10-29

共1个答案

小能豆

PyCharm 中会触发警告,因为如果在 行期间发生异常connSock = socket(AF_INET, SOCK_STREAM),则connSock到达该块时确实不会定义finally。如果发生这种情况,调用connSock.close()将引发一个UnboundLocalErrorsince connSockwas neverassigned。

解决方案

为了防止这种情况,您可以connSock在块None之前初始化try,并在尝试关闭它之前检查它是否已成功分配:

from socket import AF_INET, SOCK_STREAM, socket

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

这样,如果socket()失败,connSock将保持None,并且if connSock检查将防止调用close()未定义的变量。

解释

socket()这是针对在特定条件下(例如,如果系统用尽文件描述符)可能引发异常的情况的一种保护措施。初始化connSockNone确保您的代码能够妥善处理所有情况。

2024-10-29