Запретить отображение 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() оттуда.