2017-06-11 48 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中的代码的方法。

相关问题