2017-06-11 2 views
-2

Ich erhalte eine Fehlermeldung, wenn mein Skript das ausführt except Block:UnboundLocalError: lokal Variable ‚username‘ verwies vor der Zuweisung

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 

Es scheint mir, dass username nur auf den try-Block lokal ist.

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) 

Wie kann ich dieses Problem beheben?

+0

Kann 'username' nicht im' except' Block verwenden, wenn es nicht zugewiesen ist. – erip

+1

Wenn der Aufruf 'self.add_user()' oder einer der beiden '.get()' -Aufrufe eine Ausnahme auslöst, wird 'username' nicht gesetzt. –

Antwort

1

Es ist nicht so, dass die Variable username lokal für den try Block ist. Aber in Ihrem Fall gibt es keine Garantie, dass die username gesetzt ist, wenn es in den except Block geht.

Zum Beispiel:

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

druckt a, weil die Exception ausgelöst wurde nach username definiert wurde. Aber in Ihrem Fall scheint es, dass die Ausnahme ausgelöst wird, bevor username definiert wurde. So ist es etwa so:

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

die einem NameError (wenn die try und except sind in einem globalen Umfang) geben würde, oder ein UnboundLocalError (wenn es in einer Funktion).

Das ist der Grund, warum Sie sicherstellen sollten, dass der try -block nur den Code enthält, der "fehlschlagen darf".

Zum Beispiel, wenn Sie wissen, dass self.username_entry2.get() und self.password_entry2.get() können nicht (oder sollte nicht) scheitern Sie nutzen könnten:

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) 

Der else Block nur, wenn die try weitergegeben ausgeführt wird. Das ist eine andere Möglichkeit, den Code im try-Block zu begrenzen.

Verwandte Themen