【发布时间】:2018-03-02 19:41:55
【问题描述】:
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_()
当我们点击按钮时
点击
进程以退出代码 1 结束
This answer(我从中修改了示例)展示了如何安装自定义异常挂钩。因此,让我们取消注释上面示例中的代码行。现在它会打印回溯,并且不会在我们每次单击按钮时退出程序。
自定义函数只是旧函数的一个薄包装。为什么在引发异常时会导致不同的行为?
【问题讨论】:
-
你能edit 显示完整的minimal reproducible example 并安装了异常挂钩吗?
-
@Jean-FrançoisFabre 我不喜欢用示例代码的冗余副本浪费空间,但我同意指出插入 sn-p 的确切位置是有意义的(尽管没有很多地方合理的地方)。我希望我找到的权衡对我们所有人都有效。