Pergunta

Atualmente estou escrevendo um script que usa sqlite3.Recentemente, tive um problema com o banco de dados sendo usado por outro programa devido ao meu código ter sido encerrado antecipadamente com um erro.

Com problemas semelhantes, geralmente usa-se:

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

Mas isso não funcionará no meu caso.Resumindo, este é o meu código:

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

Depois que o programa é encerrado sem fechar a conexão, recebo erros ao tentar modificar o banco de dados.

Existe uma maneira de fechar a conexão com segurança, mesmo em uma saída suja?

Foi útil?

Solução

Para ser honesto, não entendo muito a pergunta, mas por que não encerrar o poop.do_stuff() em um try/except bloquear?

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

Ou para ser um pouco mais limpo, use um gerenciador de contexto:

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 basta executá-lo como:

with Thingmadoodle(args) as poop:
    #do things

Depois que todo o código estiver pronto, ou após uma exceção acontecer na instrução, __exit__ será executado e você poderá fechá-lo com segurança.

Espero que isto ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top