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?

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top