Chiudi un database SQLite3 sull'uscita, non importa cosa
-
21-12-2019 - |
Domanda
Attualmente sto scrivendo uno script che utilizza SQLite3.Di recente ho eseguito un problema con il database in uso da un altro programma a causa del mio codice che usciva presto con un errore.
Con problemi simili, di solito uno usa:
conn = sqlite3.connect(...)
try:
#Do stuff
finally:
conn.close()
.
Ma questo non funzionerà nel mio caso.In poche parole, questo è il mio codice:
Importa 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)
.
Dopo che il programma usciva senza chiudere la connessione, ottengo errori quando provo a modificare il database.
C'è un modo per chiudere in sicurezza la connessione, anche su un'uscita impura?
Soluzione
Per essere onesti, non capisco molto la domanda, ma perché non solo avvolgere il poop.do_stuff()
in un blocco try/except
?
try:
poop.do_stuff()
except:
poop.__del__()
finally:
poop.__del__()
.
O per essere un po 'più pulito, utilizzare un gestore del contesto:
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()
.
e semplicemente eseguirlo come:
with Thingmadoodle(args) as poop:
#do things
.
Dopo che tutto il codice viene fatto, o dopo che è accaduto un'eccezione nell'affermazione, __exit__
verrà eseguito e puoi tranquillamente chiuderlo.
Spero che questo aiuti!