2017-09-01 19 views
1

如果這樣的蟒蛇碼,沒有錯誤報告:爲什麼我在這個tr-catch-finally模塊中出錯?

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

如果這樣的蟒蛇碼,有錯誤報道,我不知道爲什麼:

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

錯誤:

[[email protected] 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 

我不知道這兩個代碼有什麼不同。對於代碼2,如何更正它,請幫助,謝謝〜

+0

在碼2,你是通過sock_name'的'不同的值迭代,以及這些原因之一碰撞。 – GLR

+0

如果套接字(AF_UNIX,SOCK_STREAM)'口令,然後'sock'沒有被分配,並且'finally'中的'sock.settimeout(None)'導致你的錯誤。 –

回答

-1

您試圖訪問一個未聲明的變量是我的理解。要修復它,請在「for」語句之前聲明該變量。我沒有測試過,但它應該可以工作。

Ex。

sock = "" #Declares a string without any data in the variable. 
0

你或許應該放在外面的插座創作的嘗試,除了-finally塊或您將訪問在該sock finally塊,即使它的創建失敗,並沒有分配。

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

診斷是好的,但是解決方案不是iso/wrt /如果在socket()調用期間發生異常,那麼作爲'process_output(e)'的OP代碼將不會被調用。 –

+0

我認爲套接字的創建是導致異常的原因,所以(通常)更好的替代方法是在'try'塊之前將'​​sock'分配給'None',並嘗試在'try'塊內創建它。 –

1

的問題確實存在(可能至少)在你的第一個片段太多,但你有沒有在它之前絆倒。

問題的根源在於socket()調用可能引發異常。如果發生這種情況並且這是第一次迭代,名稱sock將不會被定義,那麼您最終會在finally子句中引用此尚未出現的名稱。

將q & d溶液主要是確保sock是在try之前定義/ except塊:

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() 
相關問題