gpt4 book ai didi

python - 为什么我在这个 try-catch-finally block 中遇到错误?

转载 作者:太空宇宙 更新时间:2023-11-03 14:49:17 24 4
gpt4 key购买 nike

如果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,如何修正,请帮忙,谢谢~

最佳答案

这个问题实际上也存在(至少可能)在您的第一个代码片段中,但您以前没有偶然发现过它。

问题的根源在于 socket() 调用可能引发异常。如果发生这种情况并且这是第一次迭代,则名称 sock 将不会被定义,那么您最终会在 finally 子句中引用这个尚不存在的名称.

Q&D 解决方案主要是确保 sock 在 try/except block 之前定义:

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()

关于python - 为什么我在这个 try-catch-finally block 中遇到错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45999513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com