2017-06-11 81 views
-2

之前引用時我的腳本執行except塊,我得到一個錯誤:UnboundLocalError:局部變量「用戶名」分配

Traceback (most recent call last): 
    File "/usr/lib/python3.5/tkinter/__init__.py", line 1553, in __call__ 
    return self.func(*args) 
    File "/home/cali/PycharmProjects/untitled1/test2.py", line 68, in create_user 
    self.status_label.config(text='Failed to add user %s' % username) 
UnboundLocalError: local variable 'username' referenced before assignment 

在我看來,這username是本地唯一的try塊。

def create_user(self): 
    try: 
     username = self.add_user(self.username_entry2.get(), self.password_entry2.get()) 
     self.status_label.config(text='Added user %s' % username) 
    except Exception: 
     self.status_label.config(text='Failed to add user %s' % username) 

我該如何解決這個問題?

+0

如果未指定'except'塊,則不能使用'username'。 – erip

+1

如果'self.add_user()'或兩個'.get()'調用中的任何一個調用引發異常,'username'沒有設置。 –

回答

1

變量username不是try塊的本地變量。但在你的情況下,當進入except區塊時,沒有攝像機設置username

例如:

try: 
    username = 'a' 
    raise ValueError() 
except ValueError: 
    print(username) 

打印a因爲username被定義後的異常升高。但在你的情況下,似乎在定義username之前引發了異常。因此,這大致是這樣的:

try: 
    raise ValueError() 
    username = 'a' 
except ValueError: 
    print(username) 

這將使一個NameError(如果tryexcept是在全球範圍內)或UnboundLocalError(如果它是在一個函數)。

這就是爲什麼您應該確保try - 區塊只包含「允許失敗」代碼的原因。

例如,如果你知道self.username_entry2.get()self.password_entry2.get()不能(或不應該)失敗,你可以使用:

def create_user(self): 
    username_tmp = self.username_entry2.get() 
    password_tmp = self.password_entry2.get() 
    try: 
     username = self.add_user(username_tmp, password_tmp) 
    except Exception: 
     self.status_label.config(text='Failed to add user %s' % username_tmp) 
    else: 
     self.status_label.config(text='Added user %s' % username) 

else塊,如果try通過,才能執行。這是另一種限制try中的代碼的方法。

相關問題