Запретить отображение wxPython диалогового окна «Необработанное исключение» - PullRequest
1 голос
/ 06 марта 2009

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

Я хочу, чтобы он был сертифицирован для Windows Vista, поэтому он должен аварийно завершить работу, что вызывает диалоговое окно создания отчетов об ошибках Windows (которое выдает « Хотите отправить отчет в Microsoft? ») появляться. Это относится к контрольному примеру № 32 из документа " Certified for Windows Vista Test Cases ".

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

EDIT2:

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

Ответы [ 4 ]

2 голосов
/ 29 марта 2010

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

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

1 голос
/ 06 марта 2009

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

1 голос
/ 09 марта 2009

Возможно ли вам просто справиться со всем? Я полагаю, что вам придется помещать блок 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()

Затем украсьте любую функцию, которую мог бы вызвать основной цикл (поскольку я предполагаю, что именно здесь wxPython выполняет свою собственную перехватку).

0 голосов
/ 06 марта 2009
...