0

現在、sqlite3 を使用するスクリプトを作成しています。最近、コードがエラーで早期に終了したために、別のプログラムがデータベースを使用しているという問題に遭遇しました。

同様の問題で、通常は次を使用します。

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

しかし、これは私の場合はうまくいきません。一言で言えば、これは私のコードです:

インポート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)

プログラムが接続を閉じずに終了した後、データベースを変更しようとするとエラーが発生します。

汚れた出口でも安全に接続を閉じる方法はありますか?

4

1 に答える 1

1

正直なところ、私は質問をあまり理解していませんがpoop.do_stuff()try/exceptブロックでラップしないのはなぜですか?

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

または、少しきれいにするために、コンテキストマネージャーを使用します。

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

そして、次のように実行するだけです:

with Thingmadoodle(args) as poop:
    #do things

すべてのコードが完了した後、またはステートメントで例外が発生した後、__exit__実行され、安全に閉じることができます。

お役に立てれば!

于 2013-11-16T03:06:17.823 に答える