Запретить отображение wxPython диалогового окна "Необработанное исключение"

У меня есть сложное приложение с графическим интерфейсом, написанное на Python и wxPython.

Я хочу, чтобы он был сертифицирован для Windows Vista, поэтому он должен аварийно завершить работу, что приведет к появлению диалогового окна "Отчет об ошибках Windows" (которое запрашивает " Вы хотите отправить отчет в Microsoft? "). Это относится к тестовому примеру № 32 из документа " Сертифицировано для тестовых случаев Windows Vista ".

К сожалению, когда я ломаю свое приложение с ThreadHijacker Инструмент wxPython показывает сообщение как:

 Необработанное исключение
---------------------------
Произошло необработанное исключение. Нажмите "Прервать", чтобы завершить программу,
"Повторите" для нормального выхода из программы и "Игнорировать" для продолжения.
---------------------------
Прервать Повторить Игнорировать 

Как я могу запретить wxPython показывать это сообщение? У меня есть обычай sys.excepthook, но кажется, что это диалоговое окно показывается до того, как мой исключающий хук может вмешаться.

РЕДАКТИРОВАТЬ:

wxWidgets docs говорит, что wxAppConsole::OnExceptionInMainLoop вызывается, и в MSW он отображает некоторый модный диалог, который позволяет пользователю выбирать между различными вариантами. Однако кажется, что wxPython не позволяет перегрузить эту функцию... Кто-нибудь знает, как изменить поведение wxAppConsole::OnExceptionInMainLoop по умолчанию в wxPython?
Я предпочитаю решения на уровне Python, а не на C / C++

EDIT2:

В общем, я спросил в списке рассылки wxPython, и Робин Данн ответил, что он попытается сделать wxAppConsole:: OnExceptionInMainLoop перезаписываемым в следующих выпусках wxPython. Так как я не мог ждать, мне пришлось скомпилировать свою собственную версию wxPython, которая не включает эту функцию. Оказалось, что наличие функции wxAppConsole::OnExceptionInMainLoop можно включить / отключить путем правильной установки флагов компиляции.

4 ответа

Решение

Все закончилось компиляцией моих собственных wxWidgets и wxPython, с одним измененным флагом компиляции: wxUSE_EXCEPTIONS должен быть установлен в 0.

Робин Данн написал, что он попытается пропатчить wxPython, поэтому это поведение можно изменить без перекомпиляции всей библиотеки.

Возможно ли вам просто справиться со всем? Я полагаю, что вам придется помещать блок try:exception: вокруг каждого метода, связанного с виджетом. Вы можете написать декоратор:

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 выполняет свою собственную перехватку).

Если я правильно помню, это ловушка (...) на верхнем уровне (wxApp) в wxWidgets. Вы можете использовать векторный обработчик исключений или _set_se_translator(), чтобы получить первый выстрел в структурированном исключении и выйти из WER, то есть ReportFault() оттуда.

Другие вопросы по тегам