Pregunta

Actualmente estoy escribiendo un guión que utiliza sqlite3.Recientemente me encontré con un problema con la base de datos está en uso por otro programa, debido a que el código de salir temprano con un error.

Con problemas similares, por lo general se utiliza:

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

Pero esto no funciona en mi caso.En pocas palabras, este es mi código:

importación de 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)

Después de que el programa se cierra sin cerrar la conexión, me da errores al intentar modificar la base de datos.

¿Hay una forma segura de cerrar la conexión, incluso en un inmundo salir?

¿Fue útil?

Solución

Para ser honesto, no entiendo la pregunta mucho, pero ¿por qué no simplemente envuelva la poop.do_stuff() en un try/except bloque?

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

O para ser un poco más limpio, utilice un contexto manager:

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

Y sólo ejecutarlo como:

with Thingmadoodle(args) as poop:
    #do things

Después de todo el código está hecho, o después de una excepción ocurrió en la declaración, __exit__ va a ser ejecutado, y usted puede de manera segura cerca de ella.

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top