抓住mainloop,mainloop例外情况,并显示他们在MessageDialogs
-
03-07-2019 - |
题
我有一个wxPython应用程序,依赖于外部的配置文件。我想要提供的友好消息的对话,显示了如果存在任何配置错误。我已经试图使这项工作通过包裹我的应用程序。Mainloop,mainloop()呼吁在尝试/除了发言。
代码下面工作的初始代码在我的MainWindow框架分类,但没有抓住任何出现的异常内mainloop,mainloop.我怎么可以抓住这些例外的作为?
if __name__ == '__main__':
app = MyApp(0)
try:
MainWindow(None, -1, 'My Cool App')
app.MainLoop()
except ConfigParser.Error, error_message:
messagebox = wx.MessageDialog(None, error_message, 'Configuration Error', wx.OK | wx.ICON_ERROR)
messagebox.ShowModal()
我读过一些提OnExceptionInMainLoop方法,可以替代在适.应用程序级的,但来源,我读必须出的日期(2004年)由于w.应用程序不再似乎有一种方法,通过这个名字。
编辑:
我需要能够赶上未经处理的例外情况在我mainloop,mainloop这样我就可以进一步处理和显示他们在错误的对话,不是通过静默,并不终止程序。
Sys.excepthook解决方案是太低级别,并且不发挥好的wxPython mainloop,mainloop线。同时链接到其他的答案不一样的尝试/除了围绕该mainloop,mainloop其不因再次wxPython产生不同的线的应用程序的用户界面。
解决方案
我编写这样的事情 Chandler, 任何未经处理的异常弹出窗口有堆和其他信息,用户可以把附加注释(他们做了什么时候发生等等。) 和提交Chandler的开发。有点像 Mozilla对讲 (如今 他们使用Breakpad我相信)的功能,如果你会。
要做到这一点,在wxPython,需要提供重新定向参数适.应用程序。这个会弹出来 w.PyOnDemandOutputWindow (你可能会想要重写,它提供一个更好的寻找实现)。
相关的源文件中的Chandler是在这里:
- Chandler.py 启动应用程序和设置的重新定向属性,以及试图捕捉并显示错误的对话,在正常情况下应用程序的启动失败
- Application.py 定制的应用程序的对象,包括建立我们自定义的适.PyOnDemandOutputWindow
- feedback.py 已经执行情况的定制适.PyOnDemandOutputWindow;这将另外需要的反馈意见。支持和feedback_xrc.py
其他提示
不知道这是否适用于wxPython应用程序,但是在sys模块中你可以覆盖excepthook属性,这是一个用3个参数调用的函数,(type,value,traceback)
,当捕获到unaugth异常时。您可以在那里安装自己的函数,只处理您想要的异常,并为所有其他函数调用原始函数。
也许这个问题可能是一些用途,它试图捕获所有异常。
发布适合我的解决方案,但问题非常类似。
import wx
import sys
import traceback
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None)
panel = wx.Panel(self)
m_close = wx.Button(panel, -1, "Error")
m_close.Bind(wx.EVT_BUTTON, self.OnErr)
def OnErr(self, event):
1/0
def handleGUIException(exc_type, exc_value, exc_traceback):
err_msg = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
err_msg += '\n Your App will now terminate'
# Here collecting traceback and some log files to be sent for debugging.
# But also possible to handle the error and continue working.
dlg = wx.MessageDialog(None, err_msg, 'Termination dialog', wx.OK | wx.ICON_ERROR)
dlg.ShowModal()
dlg.Destroy()
sys.exit()
sys.excepthook = handleGUIException
if __name__ == '__main__':
app = wx.App(redirect=False)
top = Frame()
top.Show()
app.MainLoop()
使用 sys.excepthook
对我来说非常好。
我发现以下文章有很大的帮助: wxPython:从任何地方捕获例外情况 。