我是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()
答案 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'