首页 > 解决方案 > 如何在pyside2中记录c ++中引发的qt异常

问题描述

我有一个 QT5/Pyside2 应用程序愉快地登录到一个文件。异常也通过异常钩子记录:

sys.excepthook = lambda t, value, tb: log.exception(f'{t} {value} {"".join(traceback.format_exception(t, value, tb))}')

但是 QT 引发的一些异常似乎没有通过处理程序。它们只是打印到控制台。

2020-07-14 13:42:51,676 - TRACE - sidewindow::__init__() - new view. call super.
2020-07-14 13:42:51,681 - TRACE - sidewindow::__init__() - show window and append
QWindowsEGLStaticContext::createWindowSurface: Could not create the EGL window surface: 0x3003
qt.qpa.backingstore: composeAndFlush: makeCurrent() failed
createDIB: CreateDIBSection failed (1273x666, format: 6)

如何将这些异常重定向到文件或让 python 处理它?

标签: pythonpyqt5pyside2

解决方案


过去我在使用 PyQt 时遇到过完全相同的问题,所以我编写了一个简单的模块,允许为 stdout 和 stderr 设置输出文件。该模块称为pyfreopen但必须编译。

不幸的是,我很久以前就使用 Python 2.7 完成了它,因此它可能无法在 Python 3 上运行(我稍后会在家并检查它是否也可以为 Python 3 构建)。

用法很简单:

freopen.set_stdout(path="stderr.log")
freopen.set_stderr(path="stdout.log")

请注意,如自述文件中所述,一旦设置了输出,就无法恢复为默认行为。


推荐阅读