如果这样的python代码,没有错误报告:
try:
sock=socket(AF_UNIX, SOCK_STREAM)
sock.settimeout(20)
sock.connect(sock_name)
test_vm_connectivity(sock)
except Exception as e:
process_output(e)
finally:
sock.settimeout(None)
sock.close()
如果这样的python代码有错误,我不知道原因:
for sock_name in vm_socks:
try:
sock=socket(AF_UNIX, SOCK_STREAM)
sock.settimeout(20)
sock.connect(sock_name)
test_vm_connectivity(sock)
except Exception as e:
process_output(e)
finally:
sock.settimeout(None)
sock.close()
错误:
[root@yf-mos-test-net09 tests]# python run-vhost
global name 'socket' is not defined
Traceback (most recent call last):
File "run-vhost", line 237, in <module>
test_all()
File "run-vhost", line 215, in test_all
sock.settimeout(None)
UnboundLocalError: local variable 'sock' referenced before assignment
我不知道这两个代码有什么不同。对于code2,如何纠正它,请帮助,谢谢〜
答案 0 :(得分:2)
问题实际上存在(可能至少)在你的第一个片段中,但你以前没有偶然发现它。
问题的根源是socket()
调用可以引发异常。如果发生这种情况并且它是第一次迭代,则不会定义名称sock
,然后您最终会在finally
子句中引用此类尚未存在的名称。
Q&amp; D解决方案主要是为了确保在try / except块之前定义sock
:
for sock_name in vm_socks:
sock = None
try:
sock=socket(AF_UNIX, SOCK_STREAM)
sock.settimeout(20)
sock.connect(sock_name)
test_vm_connectivity(sock)
except Exception as e:
process_output(e)
finally:
if sock:
sock.settimeout(None)
sock.close()
答案 1 :(得分:0)
您应该将套接字创建放在try-except-finally块之外,否则即使创建失败且未分配,也将访问finally块中的sock
。
for sock_name in vm_socks:
sock=socket(AF_UNIX, SOCK_STREAM)
try:
sock.settimeout(20)
sock.connect(sock_name)
test_vm_connectivity(sock)
except Exception as e:
process_output(e)
finally:
sock.settimeout(None)
sock.close()
答案 2 :(得分:-1)
您正在尝试访问尚未声明的变量是我的理解。要修复它,请在“for”语句之前声明变量。我没有测试过这个,但它应该可行。
实施例
sock = "" #Declares a string without any data in the variable.