我有以下代码:
try: connSock = socket(AF_INET, SOCK_STREAM) connSock.connect((tgtHost, tgtPort)) except: pass finally: connSock.close()
Pycharm 表示:
在 connSock.close() 行上赋值之前可能会引用局部变量“connSock”
这怎么可能呢?
我是否遗漏了什么?
更新:
如果您的操作系统用完了描述符,socket() 函数可能会引发异常
PyCharm 中会触发警告,因为如果在 行期间发生异常connSock = socket(AF_INET, SOCK_STREAM),则connSock到达该块时确实不会定义finally。如果发生这种情况,调用connSock.close()将引发一个UnboundLocalErrorsince connSockwas neverassigned。
connSock = socket(AF_INET, SOCK_STREAM)
connSock
finally
connSock.close()
UnboundLocalError
为了防止这种情况,您可以connSock在块None之前初始化try,并在尝试关闭它之前检查它是否已成功分配:
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()
if connSock
close()
socket()这是针对在特定条件下(例如,如果系统用尽文件描述符)可能引发异常的情况的一种保护措施。初始化connSock可None确保您的代码能够妥善处理所有情况。