为什么我在这个tr-catch-finally块中出错?

时间:2017-09-01 11:41:15

标签: python

如果这样的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,如何纠正它,请帮助,谢谢〜

3 个答案:

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