سؤال

أقوم حاليًا بكتابة برنامج نصي يستخدم 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)

بعد خروج البرنامج دون إغلاق الاتصال، تظهر لي أخطاء عندما أحاول تعديل قاعدة البيانات.

هل هناك طريقة لإغلاق الاتصال بأمان، حتى عند الخروج غير النظيف؟

هل كانت مفيدة؟

المحلول

لأكون صادقًا، أنا لا أفهم السؤال كثيرًا، ولكن لماذا لا نختتم فقط 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