機能コード:Python Beginner: 'finally'の実行を防ぐ方法は?
# Connect to the DB
try:
dbi = MySQLdb.connect(host='localhost', \
user='user', \
passwd='pass', \
db='dbname', \
port=3309)
print "Connected to DB ..."
except MySQLdb.Error, e:
apiErr = 2
apiErrMsg = "Error %d: %s" % (e.args[0], e.args[1])
return
# To prevent try..finally bug in python2.4,
# one has to nest the "try: except:" part.
try:
try:
sql = dbi.cursor()
sql.execute("""
SELECT *
FROM table
WHERE idClient = %s
""", (key,))
access = sql.fetchall()
# [some more code here]
except MySQLdb.Error, e:
apiErr = 2
apiErrMsg = "Error %d: %s" % (e.args[0], e.args[1])
return
finally:
sql.close()
dbi.close()
私は試しでいることを理解しては..最後に、finallyブロックは必ず実行されます除きます。 上記のコードでは、最初のtryブロックに例外がある場合、2番目のtryブロックのfinallyを実行したくありません。私は間違って何をしていますか?
(注:のpython 2.4を使用して)
明確化:エラーが発生したときのMySQLdbは、自動的に接続を閉じた場合、私は知りません。私が上記のコードで直面している問題は、接続を確立する際にエラーが発生したとき(コードの最初のtryブロック)、finallyブロックのdbi.close()を呼び出すと "AttributeError: 'NoneType'オブジェクトに - finallyブロックで
# define at the start
dbi = None
sql = None
、REPL人に
if sql is not None:
sql.close()
if dbi is not None:
dbi.close()
おかげ 必要に応じて、これは働いていた:...
ソリューションをDBIを参照して '閉じる' 属性」 ied。私は皆さんから何か新しいことを学びました。 (私は次の時間に私の質問をより明確にフレーズしようと思う:)。
あなたは常に実行することが「最終的に」の目的であることに気づいていますか? –
@Jeremy Cantrell: 私のクエリは非常にひどくフレーズでした。 はい、私は最終的に常に実行することを知っています。私の混乱は、コードのtryブロック(最終的にその一部である)が実行を開始した場合にのみ 'finally'が実行されるという前提から生じました。つまり、2つのtryブロック(上記)がある場合、プログラム 'flow'が2番目のtryブロックを入力/実行しないと、2番目のブロックのfinallyブロックは実行されないと考えました。 (あなたが私が何を言おうとしているのか理解したいと思っています)。 –