質問

現在SQLite3を使用するスクリプトを書いています。私は最近、私のコードがエラーで早く出るために他のプログラムによって使用されているデータベースが問題になった。

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

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

しかし、これは私の訴訟では機能しません。一言で言えば、これは私のコードです:

IMPORT 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)
.

接続を閉じることなく終了後、データベースを変更しようとするとエラーが発生します。

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

役に立ちましたか?

解決

正直に言うと、私は質問がわからないが、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__が実行され、安全に閉じることができます。

これが助けに役立つことを願っています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top