【发布时间】:2013-01-07 17:18:41
【问题描述】:
这是说明问题的代码:
from PyQt4 import QtGui
app = QtGui.QApplication([])
dialog = QtGui.QDialog()
button = QtGui.QPushButton('I crash')
layout = QtGui.QHBoxLayout()
layout.addWidget(button)
dialog.setLayout(layout)
def crash(): raise Exception('Crash!')
button.clicked.connect(crash)
button.click()
print 'I should not happen'
当我运行它时,PyQt4 会为我处理错误。我的控制台显示带有“崩溃!”的堆栈跟踪等等,我看到'我不应该发生'。
这没什么用,因为我收到了一个包含许多处理程序的大型应用程序,我需要将它们的错误所有强加到我的脸上(以及我的 - 咳咳 - 自动化测试) .每次我运行时,错误都会从我的网络中逃脱,它们需要在每个处理程序中使用过多且无用的 try:except 块,以便将它们全部捕获。
换句话说,我希望好的代码非常好,而坏的代码非常糟糕。没有粉饰。
抱歉,如果这已经被问到了,但是当我电子搜索它时,我自然会得到成千上万的新手询问基本的错误处理问题(或者,更糟糕的是,我让新手询问如何关闭他们任性的异常!;)
如何覆盖 PyQt4 的默认错误处理,以便我自己传播或记录错误?也请不要回答 sys.excepthook - 它会捕获 PyQt4 没有捕获的错误。
【问题讨论】:
-
我认为你的问题是异常发生在
PyQt事件循环运行的地方(我认为这是一个不同的线程)所以你真的在问如何在线程之间移动异常. -
sry no - 我发布的代码是完整的。没有 MainLoop 事件调度器;我只是直接调用 .click() 。
-
即使它没有使用多线程,它仍然在运行事件循环机制(可以将函数执行移动到不同的线程),所以我认为问题仍然是在线程之间移动异常,只是来源和目的地是一样的。
-
您尝试
sys.excepthook了吗?它将捕获该异常。 -
print threading.currentThread() 在 .click() 之前和 def crash() 内部返回相同的对象。 (而且,一般来说,窗口架构是单线程和事件驱动的。)
标签: exception-handling pyqt pyqt4