سؤال

لدي تطبيق Wxpython يعتمد على ملف التكوين الخارجي. أريد توفير مربعات حوار ودية للرسائل التي تظهر إذا كانت هناك أي أخطاء تكوين. لقد حاولت إجراء هذا العمل من خلال لف تطبيق App.MainLoop () في محاولة/ما عدا البيان.

يعمل الرمز أدناه مع رمز init في فئة إطار MainWindow ، ولكنه لا يلتقط أي استثناءات تحدث داخل Mainloop. كيف يمكنني التقاط هذه الاستثناءات أيضًا؟

if __name__ == '__main__':
    app = MyApp(0)
    try:
        MainWindow(None, -1, 'My Cool App')
        app.MainLoop()
    except ConfigParser.Error, error_message:
        messagebox = wx.MessageDialog(None, error_message, 'Configuration Error', wx.OK | wx.ICON_ERROR)
        messagebox.ShowModal()

لقد قرأت بعض ذكر طريقة OnexceptionInmainloop التي يمكن تجاوزها في فئة WX.APP ، ولكن يجب أن يكون المصدر الذي قرأته بعيدًا عن التاريخ (2004) لأن wx.app لم يعد لديه طريقة بهذا الاسم.

تعديل:

أحتاج إلى أن أكون قادرًا على التقاط استثناءات غير معطلة أثناء Mainloop الخاص بي حتى أتمكن من التعامل معها وعرضها في مربعات حوار الخطأ ، وليس المرور بصمت ، وعدم إنهاء التطبيق.

حل Sys.ExcepThook منخفض للغاية ولا يلعب بشكل جيد مع مؤشر ترابط Wxpython Mainloop. على الرغم من أن رابط الإجابة الأخرى يقوم بنفس المحاولة/باستثناء التغليف حول mainloop الذي لا يعمل بسبب ، مرة أخرى ، إلى Wxpython يرفع مؤشر ترابط مختلف للتطبيق/واجهة المستخدم.

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

المحلول

قمت بترميز شيء مثل هذا تشاندلر, ، حيث يطفو أي استثناءات غير معطلة على نافذة مع المكدس والمعلومات الأخرى ، ويمكن للمستخدمين وضع تعليقات إضافية (ماذا فعلوا عندما حدث ذلك وما إلى ذلك) وتقديمها لمطوري تشاندلر. قليلا مثل Mozilla Talkback (الوقت الحاضر يستخدمون ميزة BreakPad على ما أعتقد) إذا صح التعبير.

للقيام بذلك في wxpython ، تحتاج إلى توفير معلمة إعادة توجيه إلى wx.app. هذا سوف يطفو على السطح wx.pyondemandOtputWindow (ربما ترغب في تجاوزه لتوفير تطبيق أجمل المظهر).

ملفات المصدر ذات الصلة في تشاندلر هنا:

  • تشاندلر يبدأ التطبيق ويقوم بتعيين السمة إعادة التوجيه ، بالإضافة إلى محاولات اللحاق وعرض حوار الخطأ في حالة فشل بدء تشغيل التطبيق العادي
  • application.py يقوم بتخصيص كائن التطبيق ، بما في ذلك إعداد wx.pyondemandomandoutputwindow المخصصة
  • ردود الفعل لديه تنفيذ WX.PyondemandOutPutwindow المخصصة ؛ سيحتاج بالإضافة إلى ذلك

نصائح أخرى

لا أعرف ما إذا كان هذا سيعمل مع تطبيق Wxpython ، ولكن في وحدة SYS ، يمكنك الكتابة فوق سمة excepthook ، وهي وظيفة تسمى 3 وسيطات ، (type, value, traceback), ، عندما يتم القبض على استثناء uncaugth. يمكنك تثبيت وظيفتك الخاصة التي تتعامل فقط مع الاستثناءات التي تريدها ، والاتصال بالوظيفة الأصلية لجميع الآخرين.

شاور: http://docs.python.org/library/sys.html#sys.excepthook

ربما هذه قد يكون السؤال من بعض الاستخدامات ، فهو يحاول التقاط جميع الاستثناءات.

نشر الحل الذي عمل بالنسبة لي مع مشكلة مماثلة للغاية.

import wx
import sys
import traceback

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        panel = wx.Panel(self)
        m_close = wx.Button(panel, -1, "Error")
        m_close.Bind(wx.EVT_BUTTON, self.OnErr)
    def OnErr(self, event):
        1/0

def handleGUIException(exc_type, exc_value, exc_traceback):
    err_msg = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
    err_msg += '\n Your App will now terminate'
    # Here collecting traceback and some log files to be sent for debugging.
    # But also possible to handle the error and continue working.
    dlg = wx.MessageDialog(None, err_msg, 'Termination dialog', wx.OK | wx.ICON_ERROR)
    dlg.ShowModal()
    dlg.Destroy()
    sys.exit()

sys.excepthook = handleGUIException

if __name__ == '__main__':
    app = wx.App(redirect=False) 
    top = Frame()
    top.Show()
    app.MainLoop()

استخدام sys.excepthook جيد جدا بالنسبة لي.

أجد المقالة التالية من مساعدة رائعة: Wxpython: التقاط استثناءات من أي مكان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top