سؤال

لدي مجمع واجهة المستخدم الرسومية تطبيق مكتوبة في بيثون و wxPython.

أريد لها أن تكون معتمدة على نظام التشغيل Windows Vista, لذلك يجب أن تحطم في الطريقة التي يؤدي بالأخطاء في Windows الحوار (الذي يسأل "هل تريد إرسال تقرير إلى Microsoft ؟ ") على ما يبدو.هذا هو ذات الصلة لاختبار القضية رقم 32 من "معتمدة على نظام التشغيل Windows Vista حالات الاختبار"الوثيقة.

للأسف عندما تحطم بلدي التطبيق مع ThreadHijacker أداة wxPython تظهر رسالة مثل:

Unhandled exception
---------------------------
An unhandled exception occurred. Press "Abort" to terminate the program,
"Retry" to exit the program normally and "Ignore" to try to continue.
---------------------------
Abort   Retry   Ignore

كيف يمكنني منع wxPython من عرض هذه الرسالة ؟ لدي مخصص sys.excepthook, ولكن يبدو أن هذا الحوار هو مبين من قبل إلا هوك يمكن أن تتداخل.

تحرير:

wxWidgets مستندات يقول wxAppConsole::OnExceptionInMainLoop ويسمى تحت MSW فإنه يعرض بعض الهوى الحوار التي تتيح للمستخدم الاختيار من بين خيارات مختلفة.ولكن يبدو أن wxPython لا تسمح الحمولة الزائدة التي تعمل...لا أحد يعرف كيفية تغيير السلوك الافتراضي wxAppConsole::OnExceptionInMainLoop في wxPython?
أنا أفضل الحلول التي هي على الثعبان مستوى أكثر من تلك التي تدخل في C/C++

EDIT2:

جميع في كل شيء ، سألت في wxPython القائمة البريدية و روبن دن أجاب أنه سوف ننظر في صنع wxAppConsole::OnExceptionInMainLoop للتجاوز في الإصدارات القادمة من wxPython.منذ أنا لا يمكن أن تنتظر ، كان تجميع نسختي الخاصة من wxPython والتي لا تشمل تلك الوظيفة.اتضح أن وجود wxAppConsole::OnExceptionInMainLoop وظيفة يمكن تمكين/تعطيل من قبل الإعداد السليم من تجميع الأعلام.

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

المحلول

كل شيء انتهى مع تجميع بلدي wxWidgets و wxPython, مع واحد فقط تجميع العلم يتغير: wxUSE_EXCEPTIONS يجب تعيين إلى 0.

روبن كتب دن أنه سيحاول تصحيح wxPython, لذلك هذا السلوك يمكن تعديلها بدون ترجمة من مكتبة كاملة.

نصائح أخرى

إذا كنت أتذكر بشكل صحيح ، هذا هو الصيد(...) في المستوى الأعلى (wxApp) في wxWidgets.يمكنك إما استخدام تنقلها استثناء معالج أو _set_se_translator() للحصول على الطلقة الأولى في الاستثناء ، والخروج إلى ور ، أيReportFault() من هناك.

هل من الممكن أن مجرد التعامل مع كل شيء ؟ سيكون لديك أعتقد وضع المحاولة:ما عدا:كتلة حول كل طريقة لا بد أن القطعة.يمكن أن تكتب الديكور:

def catch_exception(f):
    def safe(*args, **kw):
        try:
            f(*args, **kw)
        except Exception, e:
            handle_exception(e)
    return safe

def handle_exception(e):
    # do Vista stuff
    sys.exit()

ثم تزيين أي وظيفة يمكن أن يسمى من قبل mainloop (منذ أفترض حيث wxPython خاصا بها اصطياد).

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