Le code de fonction:Python Débutant: Comment empêcher l'exécution de '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()
Je comprends que, dans un essai .. sauf .. enfin, le bloc finally toujours exécuter. Dans le code ci-dessus, je ne veux pas que le bloc finally dans le second essai s'exécute s'il y a une exception dans le bloc try try. Qu'est-ce que je fais mal?
(Remarque: L'utilisation python 2.4)
Précisions: Je ne sais pas si MySQLdb ferme les connexions automatiquement lorsqu'une erreur se produit. Le problème auquel je fais face avec le code ci-dessus est, quand il y a une erreur dans l'établissement d'une connexion (le premier bloc try du code), appeler dbi.close() dans le bloc finally soulève "AttributeError: 'NoneType' objet n'a pas attribut «proche » en référence à DBI ...
Solution: Cela a fonctionné comme souhaité -
# define at the start
dbi = None
sql = None
Dans le bloc enfin,
if sql is not None:
sql.close()
if dbi is not None:
dbi.close()
Merci à ceux qui rempl ied J'ai appris quelque chose de nouveau de vous tous. (Je vais essayer de formuler mes questions plus clairement la prochaine fois :).
Vous êtes conscient que toujours exécuter est l'objectif de "enfin"? –
@Jeremy Cantrell: Ma requête était assez mal formulée. Oui, je sais enfin toujours exécute. Ma confusion résultait de l'hypothèse qu'un 'finally' ne s'exécuterait que si le bloc try du code (dont le dernier fait partie) commençait à s'exécuter. C'est-à-dire, s'il y a 2 blocs d'essai (comme ci-dessus), je pensais que le dernier bloc ne s'exécuterait pas lorsque le programme 'flux' n'entrerait pas/n'exécuterait pas le second bloc try. (J'espère que vous avez compris ce que j'essaie de dire). –