在finally子句中无法访问的try子句中的变量 - python

时间:2014-01-23 18:59:57

标签: python mysql-python

我是python的新手,很抱歉,如果这个问题很愚蠢,但有人可以告诉我这里发生了什么。

当我在mdb.connect()调用中运行以下代码而没有错误时,代码运行正常。

但是当我故意插入一个错误时(例如,放入'localhostblahblah'),我执行时会收到'NameError:name'con'未定义'错误。

我认为try子句中定义的变量应该可以在finally子句中访问。发生了什么事?

#!/usr/bin/python

import MySQLdb as mdb
import sys

try:
    con = mdb.connect('localhost','jmtoung','','ptb_genetics')

except mdb.Error, e:
    print "Error"
    sys.exit(1)

finally:
    if con:
        con.close()

3 个答案:

答案 0 :(得分:8)

如果mdb.connect出现错误,则无法分配给con,因此无法定义。

而不是finally,请尝试使用else,它仅在没有异常时运行。 Docs

try:
    con = mdb.connect('localhost','jmtoung','','ptb_genetics')

except mdb.Error as e:
    print "Error"
    sys.exit(1)

else:  # else instead of finally
    con.close()

答案 1 :(得分:1)

执行EAFP样式:

try: con = mdb.connect('localhost','jmtoung','','ptb_genetics')
except mdb.Error, e: #handle it
finally:
    try: con.close()
    except NameError: pass # it failed to connect
    except: raise # otherwise, raise that exception because it failed to close

答案 2 :(得分:0)

如果在变量赋值过程中发生错误,则不会将变量赋值给。

>>> x = 3
>>> try:
...     x = open(r'C:\xxxxxxxxxxxxxxx')
... finally:
...     print(x)
...     
3
Traceback (most recent call last):
  File "<interactive input>", line 2, in <module>
IOError: [Errno 2] No such file or directory: 'C:\\xxxxxxxxxxxxxxx'