Qt静默地捕捉Python回调中的异常,并以错误代码退出程序。这可以用一个简短的例子来证明:
import sys
from PyQt5 import QtWidgets
# _excepthook = sys.excepthook
# def exception_hook(exctype, value, traceback):
# _excepthook(exctype, value, traceback)
# sys.excepthook = exception_hook
class Test(QtWidgets.QPushButton):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setText("hello")
self.clicked.connect(self.buttonClicked)
def buttonClicked(self):
print("clicked")
raise Exception("wow")
app = QtWidgets.QApplication(sys.argv)
t = Test()
t.show()
app.exec_()
当我们点击按钮时
clicked
Process finished with exit code 1
This answer(我从中修改了示例)演示了如何安装自定义异常钩子。所以让我们取消注释上面例子中的代码行。现在它会打印回溯,并且不会在每次单击按钮时退出程序。在
自定义函数只是旧函数的一个简单包装。为什么在引发异常时会导致不同的行为?在
在PyQt4和PyQt5的旧版本(5.4或更高版本)中,行为是在您描述的任何情况下永远都不退出应用程序。这在PyQt 5.5+中进行了更改(以使应用程序退出),但前提是没有显式地为
sys.excepthook
指定异常处理程序。这在documentation中有所提及,但在mailing list中也有更详细的说明。在文件中的相关部分:
邮件列表线程中的相关部分:
也许还值得指出的是,最初的问题是由pyqtgraph的创建者在pyqt邮件列表中提出的,riverbank computing的员工表示,这种新行为不会消失。在
如果要转到源代码,相关代码位于pyqt5/qpy/QtCore/qpycore_public_美国石油学会.cpp(PyQt5的分叉版本是here)
相关问题 更多 >
编程相关推荐