2 七月, 2006

wxPython: wxApp::OnExceptionInMainLoop无效,如何接管异常处理?

wxApp::OnExceptionInMainLoop
“This function is called if an unhandled exception occurs inside the main application event loop. ”

重载了此方法,但是无效,无论什么异常,发生时,这个方法根本不会被执行。没有看过wxPython源码,猜测要么这是一个bug,要么帮助文件中的描述有问题,wxApp::MainLoop()会处理绝大部分Exceptions,所以几乎不存在“unhandled exception”。

如何接管wx App的异常处理?

写一个新的接收三参数( type, value, traceback)的过程,然后覆盖sys.excepthook

例如,在wxApp中将所有的异常都以Message Dialog形式报告给用户:

import sys, trackback

class MyApp(wx.App):
...
#new excepthook method
def _OnExceptionInMainLoop(self, type, value, traceback1):
topwin = self.GetTopWindow()
tblist = traceback.format_list(traceback.extract_tb(traceback1))
dlg = wx.MessageDialog(topwin, '%s : %srn%s'%(type, value, 'rn'.join(tblist)), 'Exception', wx.OK | wx.ICON_ERROR)
try:
dlg.ShowModal()
finally:
dlg.Destroy()
#call default exception handler here
sys.__excepthook__(type, value, traceback1)

application = MyApp(0)
#assigne new exception handler to sys.excepthook attribution
sys.excepthook = application._OnExceptionInMainLoop
application.MainLoop()

因为sys和trackback是通用模块,这个方法也适用于非wxPython应用

参考: http://docs.python.org/lib/module-sys.html


最新回复
发表评论


















Bold Italic Link