2014-06-29 84 views
4

我已经查看了有关此特定错误的其他问题,但在这些情况下,在从未定义变量的过程中存在一个路由,因此在稍后调用时会失败。然而,在我的程序中,我在try方法之前设置了变量,并在特定条件下在try方法中更改了这些变量,然后if语句稍后调用它们但失败。当Python到达if语句并尝试创建变量文本时,它宣称变量错误和error1未定义(在赋值之前引用)。UnboundLocalError:分配之前引用的局部变量'错误'

err = 0 
error = 'No Error Set' 
error1 = 'No Error1 Set' 
try: 
    conn = sqlite3.connect(db_dir) 
    for row in conn.execute("select max(date) from eod"): 
     mxdate = row 
    if mxdate == None: 
     pass 
    else: 
     for row in conn.execute('select date, status from eod where date = ?',(mxdate,)): 
      _lst_eod = row 
    for row in conn.execute("select * from temp"): 
     _crnt_eod = row 
    conn.close() 
except Exception as error: 
    error = str(error) 
    err = 1 
    logged = 0 
    try: 
     conn.close() 
     time = str(right_datetime())[11:19].replace(':','') 
     conn = sqlite3.connect(db_dir) 
     conn.execute("insert into error_log (date, user, auth, error, _action) values (?,?,?,?,'Failed to select from eod/temp tables.')",(int(str(_date)+time),cred[0],cred[1],error,)) 
     conn.commit() 
     conn.close() 
     logged = 1 
    except Exception as error1: 
     error1 = str(error1) 
if err == 1: 
    #An error occured here. 
    text = '##Error## An error occured while trying to end the day:\n'+error 
    if logged == 0: 
     text = text+'\n\nA row was written to the error log.' 
    else: 
     text = text+'\n\nWrite to Error Log failed due to error:\n'+error1 
else: 
    ....carry on with the rest of the program. 

回答

7

在Python 3中,变量并为其分配一个except SomeException as e:声明的例外是deleted在退出except块:

>>> e = "something" 
>>> try: 
...  1/0 
... except ZeroDivisionError as e: 
...  print(e) 
... 
division by zero 
>>> e 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'e' is not defined 

同样的事情发生的事情在你的代码:该except Exception as error:except Exception as error1:当他们退出时,块正在删除errorerror1

+0

这似乎是问题所在。将其更改为'Exception as _error:'然后'error = str(_error)'。我想当你声明'Exception as something'时,_something_只存在于try方法中? –

+1

是的......有一个关于我在我的答案中链接到的PEP 3110部分发生了什么的解释。 –

+0

@I_do_python作为_something_'的异常只存在于except语句中。即当发生错误时被除外 – Shadow9043

相关问题