Question

Je suis en train d'écrire un script qui utilise sqlite3.J'ai récemment rencontré un problème avec la base de données en cours d'utilisation par un autre programme à cause de mon code de sortie précoce avec une erreur.

Avec des problèmes similaires, en général on utilise:

conn = sqlite3.connect(...)
try:
    #Do stuff
finally:
    conn.close()

Mais cela ne fonctionne pas dans mon cas.En bref, c'est mon code:

import sqlite3

class Thingamadoodle:
    def __init__(self, ...):
        self.conn = sqlite3.connect(...)
        ...

    #Methods and stuff

    def __del__(self):
        self.conn.close()

poop = Thingamadoodle(...)
poop.do_stuff(...)
poop.throw_irritating_exception_that_you_cant_track_down(irritatingness=11)

Une fois que le programme se ferme sans la fermeture de la connexion, j'obtiens une erreur lorsque je tente de modifier la base de données.

Est-il un moyen de fermer la connexion, même sur un impur sortie?

Était-ce utile?

La solution

Pour être honnête, je ne comprends pas la question bien, mais pourquoi ne pas tout simplement enrouler le poop.do_stuff() dans un try/except bloc?

try:
    poop.do_stuff()
except:
    poop.__del__()
finally:
    poop.__del__()

Ou pour être un peu plus propre, utilisez un gestionnaire de contexte:

class Thingamadoodle:
    def __init__(self, ...):
        ...

    #Methods and stuff
    def __enter__(self):
        self.conn = sqlite3.connect(...)
        return self
    def __exit__(self, errorType, errorValue, errorTrace):
        self.conn.close()

Et juste l'exécuter en tant que:

with Thingmadoodle(args) as poop:
    #do things

Après tout, le code est fait, ou après qu'une exception qui s'est passé dans la déclaration, __exit__ sera exécutée, et vous pouvez le fermer.

Espérons que cette aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top