我怎样才能捕捉从wxPython应用程序的所有异常?(How can I capture all e

2019-09-04 05:28发布

我正在写一个小应用程序的调试了一下包,我们正在开发,我想这项服务推广到一些用户,看看他们是否能挑起任何崩溃。 有谁知道的有效包装一wxPython的应用程序来捕捉任何和所有未处理的异常会导致应用程序崩溃的方法吗?

理想我想捕获所有输出(不只是错误),并将其记录到文件中。 任何未处理的异常应该记录到当前文件,并然后允许例外传递按通常(即日志记录过程应该是透明的)。

我敢肯定,肯定有人做这些方针的东西之前,但我还没有成功地打开了任何东西,通过谷歌看起来非常有用。

Answer 1:

用于记录标准输出,你可以使用一个标准输出的包装,像这样的:

from __future__ import with_statement

class OutWrapper(object):
    def __init__(self, realOutput, logFileName):
        self._realOutput = realOutput
        self._logFileName = logFileName

    def _log(self, text):
        with open(self._logFileName, 'a') as logFile:
            logFile.write(text)

    def write(self, text):
        self._log(text)
        self._realOutput.write(text)

然后你在你的主要的Python文件(运行一切的一个)来初始化它:

import sys    
sys.stdout = OutWrapper(sys.stdout, r'c:\temp\log.txt')

至于记录异常,最容易做的事情是包装MainLoop wx.App的方法在try..except,然后提取异常信息,将其保存以某种方式,然后再通过提高除了raise ,如:

try:
    app.MainLoop()
except:
    exc_info = sys.exc_info()
    saveExcInfo(exc_info) # this method you have to write yourself
    raise


Answer 2:

对于异常处理,假设你的日志文件被打开日志:

import sys
import traceback

def excepthook(type, value, tb):
    message = 'Uncaught exception:\n'
    message += ''.join(traceback.format_exception(type, value, tb))
    log.write(message)

sys.excepthook = excepthook


Answer 3:

您可以使用

sys.excepthook

(见Python文档 )

并指定一些自定义对象到它,那会赶上早在你的代码没有被捕获所有异常。 然后,您可以回溯记录任何信息到任何你想要的文件,一起,做你所不同的喜欢(再加注它,显示错误信息,并允许用户继续使用您的应用程序等)。

至于记录标准输出 - 对我来说,最好的方式就是写类似DzinX的OutWrapper东西。

如果你在调试阶段,可以考虑在每个条目后冲洗你的日志文件。 这种危害表现有很多,但如果你设法引起一些底层的C代码段错误,你的日志不会误导你。



Answer 4:

有不同的方法。 你可以把try..catch块在wxApplication :: OnInit的,然而,这并不总是与工作的Gtk。

一个不错的选择将是覆盖在你的wxApplication派生类的应用::为handleEvent,写这样的代码:

void Application::HandleEvent(wxEvtHandler* handler, wxEventFunction func, wxEvent& event) const
{
    try
    {
        wxAppConsole::HandleEvent(handler, func, event);
    }
    catch (const std::exception& e)
    {
        wxMessageBox(std2wx(e.what()), _("Unhandled Error"),
            wxOK | wxICON_ERROR, wxGetTopLevelParent(wxGetActiveWindow()));
    }
}

这是一个C ++的例子,但你一定能够转化为Python的容易。



文章来源: How can I capture all exceptions from a wxPython application?