Frage

Ich schreibe gerade ein Skript, das sqlite3 verwendet.Ich hatte kürzlich ein Problem damit, dass die Datenbank von einem anderen Programm verwendet wurde, weil mein Code vorzeitig mit einem Fehler beendet wurde.

Bei ähnlichen Problemen verwendet man normalerweise:

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

Aber das wird in meinem Fall nicht funktionieren.Kurz gesagt, das ist mein Code:

sqlite3 importieren

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)

Nachdem das Programm beendet wurde, ohne die Verbindung zu schließen, erhalte ich Fehlermeldungen, wenn ich versuche, die Datenbank zu ändern.

Gibt es eine Möglichkeit, die Verbindung auch bei einem unsauberen Ausgang sicher zu schließen?

War es hilfreich?

Lösung

Um ehrlich zu sein, verstehe ich die Frage nicht besonders, aber warum nicht einfach einpacken poop.do_stuff() in einem try/except Block?

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

Oder um es etwas übersichtlicher zu gestalten, verwenden Sie einen Kontextmanager:

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()

Und führen Sie es einfach wie folgt aus:

with Thingmadoodle(args) as poop:
    #do things

Nachdem der gesamte Code fertig ist oder eine Ausnahme in der Anweisung aufgetreten ist, __exit__ wird ausgeführt und Sie können es sicher schließen.

Hoffe das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top