【问题标题】:UnboundLocalError: local variable 'username' referenced before assignmentUnboundLocalError:分配前引用的局部变量“用户名”
【发布时间】:2017-06-11 15:47:23
【问题描述】:

当我的脚本执行 except 块时出现错误:

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)

我该如何解决这个问题?

【问题讨论】:

  • 如果没有分配except,则不能在except 块中使用它。
  • 如果self.add_user() 或两个.get() 调用中的任何一个调用引发异常,则username 未设置。

标签: python exception exception-handling


【解决方案1】:

变量username 并不是try 块的本地变量。但在你的情况下,当 username 进入 except 块时,它没有被设置的保证。

例如:

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-block 只包含“允许失败”的代码

例如,如果您知道 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-block 中限制代码的另一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2020-01-16
    • 2019-12-05
    • 2017-09-19
    • 2020-09-26
    • 2022-01-02
    • 2019-03-22
    相关资源
    最近更新 更多